thg / contrib / ipythg.py

#!/usr/bin/env python
# ipythg.py - Run TortoiseHg Qt from IPython
#
# Copyright 2011 Yuya Nishihara <yuya@tcha.org>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2, incorporated herein by reference.
"""Interactive Python shell for TortoiseHg

?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object'. ?object also works, ?? prints more.

hg        -> Run hg command in cmdui.Dialog. Usage: hg verify
thg       -> Run thg command. Usage: thg log -R mercurial

dialogs   -> List of currently-opened dialogs.
repos     -> Dict of repository objects.
run       -> Module to run TortoiseHg dialogs. Usage: run.log(ui)
ui        -> Mercurial's ui object.
"""
import os, sys, shlex
from IPython import ipapi
from IPython.Shell import IPShellQt4
from PyQt4 import QtCore, QtGui

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),
                                                '..')))
if 'HGPATH' in os.environ and os.path.isdir(os.environ['HGPATH']):
    sys.path.insert(1, os.environ['HGPATH'])

from mercurial import ui
from tortoisehg.hgqt import cmdui, thgrepo, run

def _runhgcommand(self, arg):
    def newdlg(ui):
        return cmdui.Dialog(shlex.split(arg))
    run.qtrun(newdlg, self.user_ns['ui'])

def _runthgcommand(self, arg):
    run.runcommand(self.user_ns['ui'], shlex.split(arg))

def _banner():
    lines = __doc__.splitlines()
    lines[2:2] = [run.shortlicense.strip(), '']
    return '\n'.join(lines) + '\n'

def _execipyshell(ui):
    """Setup IPython shell and enter mainloop"""
    ns = {}
    for mod in (QtCore, QtGui):
        ns.update((k, v) for k, v in vars(mod).iteritems()
                  if not k.startswith('_'))
    ns.update({'dialogs': run.qtrun._dialogs, 'repos': thgrepo._repocache,
               'run': run, 'ui': ui})
    shell = IPShellQt4(argv=[], user_ns=ns)
    ip = ipapi.IPApi(shell.IP)
    ip.expose_magic('hg', _runhgcommand)
    ip.expose_magic('thg', _runthgcommand)
    shell.mainloop(banner=_banner())

def _hookqtrun(ui):
    """Hook qtrun() at dlgfunc() to hijack exec_()"""
    run.qtrun._mainapp.exec_ = lambda: _execipyshell(ui)

def main():
    os.environ['THGDEBUG'] = '1'
    os.environ['THG_GUI_SPAWN'] = '1'
    run.qtrun(_hookqtrun, ui.ui())

if __name__ == '__main__':
    main()
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.