by
Changes to 3 files · Browse files at 5719dddac0da Showing diff from parent 498981a6bc3f d5b227c1c055 Diff from another changeset...
|
|
@@ -14,6 +14,7 @@ import gobject
from mercurial import hg, ui, match, util
from mercurial.node import short
+import tortoise.menuthg
import nautilus
import os
import subprocess
@@ -45,6 +46,8 @@ os.environ['THG_ICON_PATH'] = os.path.join(thgpath, 'icons')
self.hgproc = os.path.join(thgpath, 'hgproc.py')
self.ipath = os.path.join(thgpath, 'icons', 'tortoise')
+ self.menu = tortoise.menuthg.menuThg()
+ self.menu.handlers = self
def icon(self, iname):
return os.path.join(self.ipath, iname)
@@ -82,7 +85,8 @@ self.cacherepo = None
return None
- def _open_terminal_cb(self, window, vfs_file):
+#start dialogs
+ def _open_terminal(self, window, info):
path = self.get_path_for_vfs_file(vfs_file)
if path is None:
return
@@ -90,25 +94,25 @@ terminal = self.client.get_string(TERMINAL_KEY)
os.system('%s &' % terminal)
- def _about_cb(self, window, vfs_file):
- self._run_dialog('about', [vfs_file])
+ def _about(self, window, info):
+ self._run_dialog('about', filelist=False)
- def _add_cb(self, window, vfs_files):
- self._run_dialog('add', vfs_files)
+ def _add(self, window, vfs_files):
+ self._run_dialog('add')
self.clear_cached_repo()
- def _clone_cb(self, window, vfs_file):
- self._run_dialog('clone', [vfs_file])
+ def _clone(self, window, info):
+ self._run_dialog('clone')
- def _commit_cb(self, window, vfs_files):
- self._run_dialog('commit', vfs_files)
+ def _commit(self, window, vfs_files):
+ self._run_dialog('commit')
self.clear_cached_repo()
- def _datamine_cb(self, window, vfs_files):
- self._run_dialog('datamine', vfs_files)
+ def _datamine(self, window, vfs_files):
+ self._run_dialog('datamine')
- def _diff_cb(self, window, vfs_files):
- path = self.get_path_for_vfs_file(vfs_files[0])
+ def _diff(self, window, vfs_files):
+ path = self.files[0]
if path is None:
return
repo = self.get_repo_for_path(path)
@@ -116,56 +120,78 @@ return
diffcmd = repo.ui.config('tortoisehg', 'vdiff', None)
if diffcmd is None:
- self._run_dialog('diff', vfs_files)
+ self._run_dialog('diff')
else:
cmdline = ['hg', diffcmd]
cwd = os.path.isdir(path) and path or os.path.dirname(path)
paths = [self.get_path_for_vfs_file(f) for f in vfs_files]
subprocess.Popen(cmdline + paths, shell=False, cwd=cwd)
- def _history_cb(self, window, vfs_files):
- self._run_dialog('history', vfs_files)
+ def _history(self, window, info):
+ self._run_dialog('history')
self.clear_cached_repo()
- def _init_cb(self, window, vfs_file):
- self._run_dialog('init', [vfs_file])
+ def _init(self, window, info):
+ self._run_dialog('init')
- def _recovery_cb(self, window, vfs_file):
- self._run_dialog('recovery', [vfs_file])
+ def _recovery(self, window, info):
+ self._run_dialog('recovery')
self.clear_cached_repo()
- def _revert_cb(self, window, vfs_files):
- self._run_dialog('revert', vfs_files)
+ def _revert(self, window, vfs_files):
+ self._run_dialog('revert')
self.clear_cached_repo()
- def _serve_cb(self, window, vfs_file):
- self._run_dialog('serve', [vfs_file], filelist=False)
+ def _serve(self, window, info):
+ self._run_dialog('serve', filelist=False)
- def _status_cb(self, window, vfs_file):
- self._run_dialog('status', [vfs_file])
+ def _status(self, window, info):
+ self._run_dialog('status')
- def _sync_cb(self, window, vfs_file):
- self._run_dialog('synch', [vfs_file], filelist=False)
+ def _synch(self, window, info):
+ self._run_dialog('synch', filelist=False)
self.clear_cached_repo()
- def _thgconfig_repo_cb(self, window, vfs_file):
- self._run_dialog('config', [vfs_file])
+ def _config_repo(self, window, info):
+ self._run_dialog('config')
- def _thgconfig_user_cb(self, window, vfs_file):
- self._run_dialog('config', [vfs_file], filelist=False)
+ def _config_user(self, window, info):
+ self._run_dialog('config', filelist=False)
- def _unmerge_cb(self, window, vfs_file):
- self._run_dialog('checkout', [vfs_file], filelist=False,
+ def _unmerge(self, window, info):
+ self._run_dialog('checkout', filelist=False,
extras=['--', '--clean', str(self.rev0)])
self.clear_cached_repo()
- def _run_dialog(self, hgcmd, vfs_files, filelist=True, extras=[]):
+ def _shelve(self, window, info):
+ print "not supported" # will be replaced
+
+ _vdiff=_diff
+
+ def _rename(self, window, info):
+ print "not supported" # will be replaced
+
+ def _remove(self, window, info):
+ print "not supported" # will be replaced
+
+ def _annotate(self, window, info):
+ print "not supported" # will be replaced
+
+ def _update(self, window, info):
+ print "not supported" # will be replaced
+
+ def _merge(self, window, info):
+ print "not supported" # will be replaced
+
+ def _grep(self, window, info):
+ print "not supported" # will be replaced
+
+ def _run_dialog(self, hgcmd, filelist=True, extras=[]):
'''
hgcmd - hgproc subcommand
- vfs_files - directory, or list of selected files
filelist - bool for whether to generate file list for hgproc
'''
- paths = [self.get_path_for_vfs_file(f) for f in vfs_files]
+ paths = self.files
if paths[0] is None:
return
@@ -198,236 +224,54 @@ self.cacherepo = None
self.cacheroot = None
+ def buildMenu(self, menuf, vfsfile):
+ '''Build menu'''
+
+ self.files = [self.get_path_for_vfs_file(f) for f in vfsfile]
+ return self._buildMenu(menuf(self.files))
+
+ def _buildMenu(self, menus, pos=0):
+ '''Build menu'''
+
+ items = []
+ for menu_info in menus:
+ pos += 1
+ idstr = 'HgNautilus::%02d' % pos
+ if menu_info.isSep():
+ #can not insert a separator till now
+ pass
+ elif menu_info.isSubmenu():
+ if nautilus.__dict__.get('Menu'):
+ item = nautilus.MenuItem(idstr, menu_info.menutext,
+ menu_info.helptext)
+ submenu = nautilus.Menu()
+ item.set_submenu(submenu)
+ for subitem in self._buildMenu(menu_info.get_menus()):
+ submenu.append_item(subitem)
+ items.append(item)
+ else: #submenu not suported
+ for subitem in self._buildMenu(menu_info.get_menus(), pos):
+ items.append(subitem)
+ pos+= 1
+ else:
+ if menu_info.state:
+ item = nautilus.MenuItem(idstr,
+ menu_info.menutext,
+ menu_info.helptext,
+ self.icon(menu_info.icon))
+ item.connect('activate', menu_info.handler, '')
+ items.append(item)
+ return items
+
def get_background_items(self, window, vfs_file):
'''Build context menu for current directory'''
- mainitem = nautilus.MenuItem('HgNautilus', 'Mercurial', '')
- submenu = nautilus.Menu()
- mainitem.set_submenu(submenu)
-
- path = self.get_path_for_vfs_file(vfs_file)
- if path is None:
- return
-
- repo = self.get_repo_for_path(path)
- if repo is None:
- ''' The name given to nautilus.MenuItem decides the
- of the menu, which is ordered alpahbetically '''
- item = nautilus.MenuItem('HgNautilus::newtree',
- 'Create New Repository',
- 'Make directory versioned',
- self.icon('menucreaterepos.ico'))
- item.connect('activate', self._init_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::clone',
- 'Create Clone',
- 'Create clone here from source',
- self.icon('menuclone.ico'))
- item.connect('activate', self._clone_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::99about',
- 'About TortoiseHg',
- 'Information about TortoiseHg installation',
- self.icon('menuabout.ico'))
- item.connect('activate', self._about_cb, vfs_file)
- submenu.append_item(item)
-
- return mainitem,
-
- if len(repo.changectx(None).parents()) > 1:
- self.rev0 = repo.changectx(None).parents()[0].rev()
- item = nautilus.MenuItem('HgNautilus::undomerge',
- 'Undo Merge',
- 'Clean checkout of original parent revision',
- self.icon('menuunmerge.ico'))
- item.connect('activate', self._unmerge_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::10commit',
- 'Commit',
- 'Commit changes',
- self.icon('menucommit.ico'))
- item.connect('activate', self._commit_cb, [vfs_file])
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::20status',
- 'Show Status',
- 'Show Repository Status',
- self.icon('menushowchanged.ico'))
- item.connect('activate', self._status_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::30diff',
- 'Visual Diff',
- 'Show Changes to Repository',
- self.icon('menudiff.ico'))
- item.connect('activate', self._diff_cb, [vfs_file])
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::40dag',
- 'Revision History',
- 'Show revision DAG',
- self.icon('menurevisiongraph.ico'))
- item.connect('activate', self._history_cb, [vfs_file])
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::50datamine',
- 'Data Mining',
- 'Search revision history',
- self.icon('menulog.ico'))
- item.connect('activate', self._datamine_cb, [vfs_file])
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::60sync',
- 'Synchronize',
- 'Sync with another repository',
- self.icon('menusynch.ico'))
- item.connect('activate', self._sync_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::70serve',
- 'Web Server',
- 'Start internal web server',
- self.icon('proxy.ico'))
- item.connect('activate', self._serve_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::75recover',
- 'Recovery',
- 'General repair and recovery of repository',
- self.icon('general.ico'))
- item.connect('activate', self._recovery_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::80repoconfig',
- 'Repository Settings',
- 'Configure Mercurial settings for this repo',
- self.icon('menusettings.ico'))
- item.connect('activate', self._thgconfig_repo_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::85userconfig',
- 'User-Global Settings',
- 'Configure global Mercurial settings',
- self.icon('menusettings.ico'))
- item.connect('activate', self._thgconfig_user_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::99about',
- 'About TortoiseHg',
- 'Information about TortoiseHg installation',
- self.icon('menuabout.ico'))
- item.connect('activate', self._about_cb, vfs_file)
- submenu.append_item(item)
-
- return mainitem,
+ if vfs_file:
+ return self.buildMenu(self.menu.get_commands, [vfs_file])
def get_file_items(self, window, vfs_files):
- mainitem = nautilus.MenuItem('HgNautilus', 'Mercurial', '')
- submenu = nautilus.Menu()
- mainitem.set_submenu(submenu)
-
- '''Build context menu for selected files'''
- if not vfs_files:
- return None
-
- vfs_file = vfs_files[0]
- path = self.get_path_for_vfs_file(vfs_file)
- repo = self.get_repo_for_path(path)
- if repo is None:
- if not vfs_file.is_directory():
- return None
-
- # Menu for unrevisioned subdirectory
- name = vfs_files[0].get_name()
- item = nautilus.MenuItem('HgNautilus::10newtree',
- 'Make directory versioned',
- 'Create Repository in %s' % name,
- self.icon('menucreaterepos.ico'))
- item.connect('activate', self._init_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::20clone',
- 'Create clone from source',
- 'Create Clone in %s' % name,
- self.icon('menuclone.ico'))
- item.connect('activate', self._clone_cb, vfs_file)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::99about',
- 'About TortoiseHg',
- 'Information about TortoiseHg installation',
- self.icon('menuabout.ico'))
- item.connect('activate', self._about_cb, vfs_file)
- submenu.append_item(item)
-
- return mainitem,
-
- localpaths = []
- for vfs_file in vfs_files:
- path = self.get_path_for_vfs_file(vfs_file)
- if path is None:
- continue
- localpath = path[len(repo.root)+1:]
- localpaths.append(localpath)
-
- if not localpaths:
- return
- path = localpaths[0]
- cwd = os.path.isdir(path) and path or os.path.dirname(path)
- matcher = match.exact(repo.root, cwd, localpaths)
- changes = repo.dirstate.status(matcher, True, True, True)
- (lookup, modified, added, removed, deleted, unknown,
- ignored, clean) = changes
-
- # Add menu items based on states list
- if unknown:
- item = nautilus.MenuItem('HgNautilus::30add',
- 'Add Files',
- 'Add unversioned files',
- self.icon('menuadd.ico'))
- item.connect('activate', self._add_cb, vfs_files)
- submenu.append_item(item)
-
- if modified or added or removed or deleted or unknown:
- item = nautilus.MenuItem('HgNautilus::40commit',
- 'Commit Files',
- 'Commit changes',
- self.icon('menucommit.ico'))
- item.connect('activate', self._commit_cb, vfs_files)
- submenu.append_item(item)
-
- item = nautilus.MenuItem('HgNautilus::50revert',
- 'Undo Changes',
- 'Revert changes to files',
- self.icon('menurevert.ico'))
- item.connect('activate', self._revert_cb, vfs_files)
- submenu.append_item(item)
-
- if modified or clean:
- item = nautilus.MenuItem('HgNautilus::60log',
- 'File Changelog',
- 'Show file revision history',
- self.icon('menulog.ico'))
- item.connect('activate', self._history_cb, vfs_files)
- item = nautilus.MenuItem('HgNautilus::annotate',
- 'Annotate File',
- 'Annotate file at current revision',
- self.icon('menulog.ico'))
- item.connect('activate', self._datamine_cb, vfs_files)
- submenu.append_item(item)
-
-
- if modified:
- item = nautilus.MenuItem('HgNautilus::70diff',
- 'File Diffs',
- 'Show file changes',
- self.icon('menudiff.ico'))
- item.connect('activate', self._diff_cb, vfs_files)
- submenu.append_item(item)
-
- return mainitem,
+ '''Build context menu for selected files/directories'''
+ if vfs_files:
+ return self.buildMenu(self.menu.get_commands, vfs_files)
def get_columns(self):
return nautilus.Column("HgNautilus::80hg_status",
@@ -482,18 +326,18 @@ file.add_string_attribute('hg_status', status)
# property page borrowed from http://www.gnome.org/~gpoo/hg/nautilus-hg/
- def __add_row(self, table, row, label_item, label_value):
+ def __add_row(self, row, label_item, label_value):
label = gtk.Label(label_item)
label.set_use_markup(True)
label.set_alignment(1, 0)
- table.attach(label, 0, 1, row, row + 1, gtk.FILL, gtk.FILL, 0, 0)
+ self.table.attach(label, 0, 1, row, row + 1, gtk.FILL, gtk.FILL, 0, 0)
label.show()
label = gtk.Label(label_value)
label.set_use_markup(True)
label.set_alignment(0, 1)
label.show()
- table.attach(label, 1, 2, row, row + 1, gtk.FILL, 0, 0, 0)
+ self.table.attach(label, 1, 2, row, row + 1, gtk.FILL, 0, 0, 0)
def get_property_pages(self, vfs_files):
if len(vfs_files) != 1:
@@ -505,7 +349,6 @@ repo = self.get_repo_for_path(path)
if repo is None:
return
-
localpath = path[len(repo.root)+1:]
emblem, status = self._get_file_status(repo, localpath)
@@ -528,22 +371,21 @@
self.property_label = gtk.Label('Mercurial')
- table = gtk.Table(7, 2, False)
- table.set_border_width(5)
- table.set_row_spacings(5)
- table.set_col_spacings(5)
+ self.table = gtk.Table(7, 2, False)
+ self.table.set_border_width(5)
+ self.table.set_row_spacings(5)
+ self.table.set_col_spacings(5)
- self.__add_row(table, 0, '<b>Status</b>:', status)
- self.__add_row(table, 1, '<b>Last-Commit-Revision</b>:', str(rev))
- self.__add_row(table, 2, '<b>Last-Commit-Description</b>:', description)
- self.__add_row(table, 3, '<b>Last-Commit-Date</b>:', date)
- self.__add_row(table, 4, '<b>Last-Commit-User</b>:', user)
+ self.__add_row(0, '<b>Status</b>:', status)
+ self.__add_row(1, '<b>Last-Commit-Revision</b>:', str(rev))
+ self.__add_row(2, '<b>Last-Commit-Description</b>:', description)
+ self.__add_row(3, '<b>Last-Commit-Date</b>:', date)
+ self.__add_row(4, '<b>Last-Commit-User</b>:', user)
if tags:
- self.__add_row(table, 5, '<b>Tags</b>:', tags)
+ self.__add_row(5, '<b>Tags</b>:', tags)
if branch != 'default':
- self.__add_row(table, 6, '<b>Branch</b>:', branch)
+ self.__add_row(6, '<b>Branch</b>:', branch)
- table.show()
-
+ self.table.show()
return nautilus.PropertyPage("MercurialPropertyPage::status",
- self.property_label, table),
+ self.property_label, self.table),
|
|
@@ -17,6 +17,7 @@ import _winreg
from mercurial import hg
from thgutil import *
+import menuthg
try:
from mercurial.error import RepoError
@@ -35,44 +36,6 @@S_OK = 0
S_FALSE = 1
-class TortoiseMenu(object):
- def __init__(self, menutext, helptext, handler, icon=None, state=True):
- self.menutext = menutext
- self.helptext = helptext
- self.handler = handler
- self.state = state
- self.icon = icon
-
-class TortoiseSubmenu(object):
- def __init__(self, menutext, menus=[], icon=None):
- self.menutext = menutext
- self.menus = menus[:]
- self.icon = icon
-
- def add_menu(self, menutext, helptext, handler, icon=None, state=True):
- self.menus.append(TortoiseMenu(menutext, helptext, handler, icon, state))
-
- def add_sep(self):
- self.menus.append(TortoiseMenuSep())
-
- def get_menus(self):
- return self.menus
-
-class TortoiseMenuSep(object):
- def __init__(self):
- pass
-
-def open_repo(path):
- root = find_root(path)
- if root:
- try:
- repo = hg.repository(ui.ui(), path=root)
- return repo
- except RepoError:
- pass
-
- return None
-
def open_dialog(cmd, cmdopts='', cwd=None, root=None, filelist=[], gui=True):
app_path = find_path("hgproc", get_prog_root(), '.EXE;.BAT')
@@ -122,7 +85,7 @@ stdin=subprocess.PIPE)
"""Windows shell extension that adds context menu items to Mercurial repository"""
-class ContextMenuExtension:
+class ContextMenuExtension(menuthg.menuThg):
_reg_progid_ = "Mercurial.ShellExtension.ContextMenu"
_reg_desc_ = "Mercurial Shell Extension"
_reg_clsid_ = "{EEE9936B-73ED-4D45-80C9-AF918354F885}"
@@ -157,6 +120,7 @@ self._folder = None
self._filenames = []
self._handlers = {}
+ menuthg.menuThg.__init__(self)
def Initialize(self, folder, dataobj, hkey):
if folder:
@@ -171,11 +135,11 @@
def _create_menu(self, parent, menus, pos, idCmd, idCmdFirst):
for menu_info in menus:
- if type(menu_info) == TortoiseMenuSep:
+ if menu_info.isSep():
win32gui.InsertMenu(parent, pos,
win32con.MF_BYPOSITION|win32con.MF_SEPARATOR,
idCmdFirst + idCmd, None)
- elif type(menu_info) == TortoiseSubmenu:
+ elif menu_info.isSubmenu():
submenu = win32gui.CreatePopupMenu()
idCmd = self._create_menu(submenu, menu_info.get_menus(), 0,
idCmd, idCmdFirst)
@@ -193,7 +157,7 @@ item, _ = win32gui_struct.PackMENUITEMINFO(**opt)
win32gui.InsertMenuItem(parent, pos, True, item)
self._handlers[idCmd] = ("", lambda x,y: 0)
- elif type(menu_info) == TortoiseMenu:
+ else:
fstate = win32con.MF_BYCOMMAND
if menu_info.state is False:
fstate |= win32con.MF_GRAYED
@@ -227,226 +191,22 @@ # The number '30000' is just a guess based on my observation
print "idCmdFirst = ", idCmdFirst
if idCmdFirst >= 30000:
- thgmenu.append(TortoiseMenuSep())
+ thgmenu.append(menuthg.TortoiseMenuSep())
# As we are a context menu handler, we can ignore verbs.
self._handlers = {}
if self._folder and self._filenames:
# get menus with drag-n-drop support
- commands = self._get_commands_dragdrop()
+ thgmenu+= self.get_commands_dragdrop(self._filenames, self._folder)
else:
- # add regularly used commit menu to main context menu
- rpath = self._folder or self._filenames[0]
- if open_repo(rpath):
- thgmenu.append(TortoiseMenu(_("HG Commit..."),
- _("Commit changes in repository"),
- self._commit, icon="menucommit.ico"))
-
- # get other menus for hg submenu
- commands = self._get_commands()
+
+ # get menus for hg menu
+ thgmenu+= self.get_commands(self._filenames)
+
+ idCmd = self._create_menu(hMenu, thgmenu, indexMenu, 0, idCmdFirst)
- # add common menu items
- commands.append(TortoiseMenuSep())
- commands.append(TortoiseMenu(_("About"),
- _("About TortoiseHg"),
- self._about, icon="menuabout.ico"))
-
- if commands:
- # create submenus with Hg commands
- thgmenu.append(TortoiseSubmenu("TortoiseHG", commands,
- icon="hg.ico"))
- thgmenu.append(TortoiseMenuSep())
-
- idCmd = self._create_menu(hMenu, thgmenu, indexMenu, 0,
- idCmdFirst)
-
- # Return total number of menus & submenus we've added
- return idCmd
- else:
- # no applicable Hg actions
- return 0
-
- def _get_commands_dragdrop(self):
- """
- Get a list of commands valid for the current selection.
-
- Each command is a tuple containing (display text, handler).
- """
-
- print "_get_commands_dragdrop() on %s" % ", ".join(self._filenames)
-
- # we can only accept dropping one item
- if len(self._filenames) > 1:
- return []
-
- # open repo
- drag_repo = None
- drop_repo = None
-
- print "drag = %s" % self._filenames[0]
- print "drop = %s" % self._folder
-
- drag_path = self._filenames[0]
- drag_repo = open_repo(drag_path)
- if not drag_repo:
- return []
- if drag_repo and drag_repo.root != drag_path:
- return [] # dragged item must be a hg repo root directory
-
- drop_repo = open_repo(self._folder)
-
- result = []
- result.append(TortoiseMenu(_("Create Clone"),
- _("Create clone here from source"),
- self._clone_here, icon="menuclone.ico"))
-
- if drop_repo:
- result.append(TortoiseMenu(_("Synchronize"),
- _("Synchronize with dragged repository"),
- self._synch_here, icon="menusynch.ico"))
- return result
-
- def _get_commands(self):
- """
- Get a list of commands valid for the current selection.
-
- Each command is a tuple containing (display text, handler).
- """
-
- print "_get_commands() on %s" % ", ".join(self._filenames)
-
- # open repo
- result = []
- rpath = self._folder or self._filenames[0]
- repo = open_repo(rpath)
- if repo is None:
- result.append(TortoiseMenu(_("Clone a Repository"),
- _("clone a repository"),
- self._clone, icon="menuclone.ico"))
- result.append(TortoiseMenu(_("Create Repository Here"),
- _("create a new repository in this directory"),
- self._init, icon="menucreaterepos.ico",
- state=os.path.isdir(rpath)))
- else:
- for f in self._filenames:
- if f.endswith('.hgignore'):
- result.append(TortoiseMenu(_("Edit Ignore Filter"),
- _("Edit repository ignore filter"),
- self._hgignore, icon="general.ico")) # needs ico
- break
-
- result.append(TortoiseMenu(_("View File Status"),
- _("Repository status"),
- self._status, icon="menushowchanged.ico"))
- result.append(TortoiseMenu(_("Shelve Changes"),
- _("Shelve or unshelve repository changes"),
- self._shelve, icon="general.ico")) # needs ico
-
- # Visual Diff (any extdiff command)
- has_vdiff = repo.ui.config('tortoisehg', 'vdiff', '') != ''
- result.append(TortoiseMenu(_("Visual Diff"),
- _("View changes using GUI diff tool"),
- self._vdiff, icon="TortoiseMerge.ico",
- state=has_vdiff))
-
- if len(self._filenames) == 0:
- result.append(TortoiseMenu(_("Guess Renames"),
- _("Detect renames and copies"),
- self._guess_rename, icon="general.ico")) # needs ico
- elif len(self._filenames) == 1:
- result.append(TortoiseMenu(_("Rename File"),
- _("Rename file or directory"),
- self._rename, icon="general.ico")) # needs ico
-
- result.append(TortoiseMenu(_("Add Files"),
- _("Add files to Hg repository"),
- self._add, icon="menuadd.ico"))
- result.append(TortoiseMenu(_("Remove Files"),
- _("Remove selected files on the next commit"),
- self._remove, icon="menudelete.ico"))
- result.append(TortoiseMenu(_("Undo Changes"),
- _("Revert selected files"),
- self._revert, icon="menurevert.ico"))
-
- # we can only annotate file but not directories
- annotatible = len(self._filenames) > 0
- for f in self._filenames:
- if not os.path.isfile(f):
- annotatible = False
- break
- result.append(TortoiseMenu(_("Annotate Files"),
- _("show changeset information per file line"),
- self._annotate, icon="menublame.ico",
- state=annotatible))
-
- result.append(TortoiseMenuSep())
- result.append(TortoiseMenu(_("Update To Revision"),
- _("update working directory"),
- self._update, icon="menucheckout.ico"))
-
- can_merge = len(repo.heads()) > 1 and \
- len(repo.changectx(None).parents()) < 2
- result.append(TortoiseMenu(_("Merge Revisions"),
- _("merge working directory with another revision"),
- self._merge, icon="menumerge.ico",
- state=can_merge))
-
- in_merge = len(repo.changectx(None).parents()) > 1
- result.append(TortoiseMenu(_("Undo Merge"),
- _("Undo merge by updating to revision"),
- self._merge, icon="menuunmerge.ico",
- state=in_merge))
-
- result.append(TortoiseMenuSep())
-
- result.append(TortoiseMenu(_("View Changelog"),
- _("View revision history"),
- self._history, icon="menulog.ico"))
-
- result.append(TortoiseMenu(_("Search Repository"),
- _("Search revisions of files for a text pattern"),
- self._grep, icon="menurepobrowse.ico"))
-
- if repo.ui.config('tortoisehg', 'view'):
- result.append(TortoiseMenu(_("Revision Graph"),
- _("View history with DAG graph"),
- self._view, icon="menurevisiongraph.ico"))
-
- result.append(TortoiseMenuSep())
-
- result.append(TortoiseMenu(_("Synchronize..."),
- _("Synchronize with remote repository"),
- self._synch, icon="menusynch.ico"))
- result.append(TortoiseMenu(_("Recovery..."),
- _("General repair and recovery of repository"),
- self._recovery, icon="general.ico"))
- result.append(TortoiseMenu(_("Web Server"),
- _("start web server for this repository"),
- self._serve, icon="proxy.ico"))
-
- result.append(TortoiseMenuSep())
- result.append(TortoiseMenu(_("Create Clone"),
- _("Clone a repository here"),
- self._clone, icon="menuclone.ico"))
- can_init = repo.root != rpath and os.path.isdir(rpath)
- result.append(TortoiseMenu(_("Create Repository Here"),
- _("create a new repository in this directory"),
- self._init, icon="menucreaterepos.ico",
- state=can_init))
-
- # config setttings menu
- result.append(TortoiseMenuSep())
- optmenu = TortoiseSubmenu(_("Settings"),icon="menusettings.ico")
- optmenu.add_menu(_("Global"),
- _("Configure user wide settings"),
- self._config_user, icon="settings_user.ico")
- if repo:
- optmenu.add_menu(_("Repository"),
- _("Configure settings local to this repository"),
- self._config_repo, icon="settings_repo.ico")
- result.append(optmenu)
-
- return result
+ # Return total number of menus & submenus we've added
+ return idCmd
def InvokeCommand(self, ci):
mask, hwnd, verb, params, dir, nShow, hotkey, hicon = ci
|
|
|
@@ -0,0 +1,296 @@ + # Published under the GNU GPL, v2 or later.
+# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
+# Copyright (C) 2007 Henry Ludemann <misc@hl.id.au>
+# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
+
+import os
+#import tempfile
+from mercurial import hg
+from thgutil import *
+from mercurial import ui
+from mercurial.i18n import _
+
+try:
+ from mercurial.error import RepoError
+except ImportError:
+ from mercurial.repo import RepoError
+
+
+class TortoiseMenu(object):
+
+ def __init__(self, menutext, helptext, handler, icon=None, state=True):
+ self.menutext = menutext
+ self.helptext = helptext
+ self.handler = handler
+ self.state = state
+ self.icon = icon
+
+ def isSubmenu(self):
+ return False
+
+ def isSep(self):
+ return False
+
+
+class TortoiseSubmenu(TortoiseMenu):
+
+ def __init__(self, menutext, helptext, menus=[], icon=None):
+ TortoiseMenu.__init__(self, menutext, helptext, None, icon)
+ self.menus = menus[:]
+
+ def add_menu(self, menutext, helptext, handler, icon=None, state=True):
+ self.menus.append(TortoiseMenu(menutext, helptext,
+ handler, icon, state))
+
+ def add_sep(self):
+ self.menus.append(TortoiseMenuSep())
+
+ def get_menus(self):
+ return self.menus
+
+ def append(self, entry):
+ self.menus.append(entry)
+
+ def isSubmenu(self):
+ return True
+
+
+class TortoiseMenuSep(object):
+
+ def isSubmenu(self):
+ return False
+
+ def isSep(self):
+ return True
+
+
+def open_repo(path):
+ root = find_root(path)
+ if root:
+ try:
+ repo = hg.repository(ui.ui(), path=root)
+ return repo
+ except RepoError:
+ pass
+
+ return None
+
+
+class menuThg:
+ """shell extension that adds context menu items"""
+
+ def __init__(self):
+ self.handlers = self
+ self.name = "TortoiseHG"
+
+ def get_commands_dragdrop(self, srcfiles, destfolder):
+ """
+ Get a list of commands valid for the current selection.
+
+ Commands are instances of TortoiseMenu, TortoiseMenuSep or TortoiseMenu
+ """
+
+ try:
+ print "_get_commands_dragdrop() on %s" % ", ".join(files)
+ except:
+ print "_get_commands_dragdrop() on some files"
+
+ # we can only accept dropping one item
+ if len(srcfiles) > 1:
+ return []
+
+ # open repo
+ drag_repo = None
+ drop_repo = None
+
+ print "drag = %s" % self.srcfiles[0]
+ print "drop = %s" % self.destfolder
+
+ drag_path = self.srcfiles[0]
+ drag_repo = open_repo(drag_path)
+ if not drag_repo:
+ return []
+ if drag_repo and drag_repo.root != drag_path:
+ return [] # dragged item must be a hg repo root directory
+
+ drop_repo = open_repo(self._folder)
+
+ thgmenu = []
+ thgmenu.append(TortoiseMenu(_("Create Clone"),
+ _("Create clone here from source"),
+ self.handlers._clone_here, icon="menuclone.ico"))
+
+ if drop_repo:
+ thgmenu.append(TortoiseMenu(_("Synchronize"),
+ _("Synchronize with dragged repository"),
+ self.handlers._synch_here, icon="menusynch.py"))
+ return thgmenu
+
+ def get_commands(self, files):
+ """
+ Get a list of commands valid for the current selection.
+
+ Commands are instances of TortoiseMenu, TortoiseMenuSep or TortoiseMenu
+ """
+ try:
+ print "_get_commands() on %s" % ", ".join(files)
+ except:
+ print "_get_commands() on some files"
+
+ # open repo
+ if type(files) != list:
+ files = [files]
+ if not files:
+ return []
+ rpath = files[0]
+ repo = open_repo(rpath)
+
+ thgmenu = []
+
+ if repo:
+ thgmenu.append(TortoiseMenu(_("HG Commit..."),
+ _("Commit changes in repository"),
+ self.handlers._commit, icon="menucommit.ico"))
+
+ menu = TortoiseSubmenu(self.name, "Mercurial", [], icon="hg.ico")
+
+ if repo is None:
+ menu.append(TortoiseMenu(_("Clone a Repository"),
+ _("clone a repository"),
+ self.handlers._clone, icon="menuclone.ico"))
+ menu.append(TortoiseMenu(_("Create Repository Here"),
+ _("create a new repository in this directory"),
+ self.handlers._init, icon="menucreaterepos.ico",
+ state=os.path.isdir(rpath)))
+ else:
+
+ for f in files:
+ if f.endswith('.hgignore'):
+ menu.append(TortoiseMenu(_("Edit Ignore Filter"),
+ _("Edit repository ignore filter"),
+ self.handlers._hgignore, icon="general.ico")) # needs ico
+ break
+
+ menu.append(TortoiseMenu(_("View File Status"),
+ _("Repository status"),
+ self.handlers._status, icon="menushowchanged.ico"))
+
+ menu.append(TortoiseMenu(_("Shelve Changes"),
+ _("Shelve or unshelve repository changes"),
+ self.handlers._shelve, icon="general.ico")) # needs ico
+
+ # Visual Diff (any extdiff command)
+ has_vdiff = repo.ui.config('tortoisehg', 'vdiff', '') != ''
+ menu.append(TortoiseMenu(_("Visual Diff"),
+ _("View changes using GUI diff tool"),
+ self.handlers._vdiff, icon="TortoiseMerge.ico",
+ state=has_vdiff))
+
+ if len(files) == 0:
+ menu.append(TortoiseMenu(_("Guess Renames"),
+ _("Detect renames and copies"),
+ self.handlers._guess_rename, icon="general.ico")) # needs ico
+ elif len(files) == 1:
+ menu.append(TortoiseMenu(_("Rename File"),
+ _("Rename file or directory"),
+ self.handlers._rename, icon="general.ico")) # needs ico
+
+ menu.append(TortoiseMenu(_("Add Files"),
+ _("Add files to Hg repository"),
+ self.handlers._add, icon="menuadd.ico"))
+ menu.append(TortoiseMenu(_("Remove Files"),
+ _("Remove selected files on the next commit"),
+ self.handlers._remove, icon="menudelete.ico"))
+ menu.append(TortoiseMenu(_("Undo Changes"),
+ _("Revert selected files"),
+ self.handlers._revert, icon="menurevert.ico"))
+
+ # we can only annotate file but not directories
+ annotatible = len(files) > 0
+ for f in files:
+ if not os.path.isfile(f):
+ annotatible = False
+ break
+ menu.append(TortoiseMenu(_("Annotate Files"),
+ _("show changeset information per file line"),
+ self.handlers._annotate, icon="menublame.ico",
+ state=annotatible))
+
+ menu.append(TortoiseMenuSep())
+ menu.append(TortoiseMenu(_("Update To Revision"),
+ _("update working directory"),
+ self.handlers._update, icon="menucheckout.ico"))
+
+ can_merge = len(repo.heads()) > 1 and \
+ len(repo.changectx(None).parents()) < 2
+ menu.append(TortoiseMenu(_("Merge Revisions"),
+ _("merge working directory with another revision"),
+ self.handlers._merge, icon="menumerge.ico",
+ state=can_merge))
+
+ in_merge = len(repo.changectx(None).parents()) > 1
+ menu.append(TortoiseMenu(_("Undo Merge"),
+ _("Undo merge by updating to revision"),
+ self.handlers._merge, icon="menuunmerge.ico",
+ state=in_merge))
+
+ menu.append(TortoiseMenuSep())
+
+ menu.append(TortoiseMenu(_("View Changelog"),
+ _("View revision history"),
+ self.handlers._history, icon="menulog.ico"))
+
+ menu.append(TortoiseMenu(_("Search Repository"),
+ _("Search revisions of files for a text pattern"),
+ self.handlers._grep, icon="menurepobrowse.ico"))
+
+ if repo.ui.config('tortoisehg', 'view'):
+ menu.append(TortoiseMenu(_("Revision Graph"),
+ _("View history with DAG graph"),
+ self.handlers._view, icon="menurevisiongraph.ico"))
+
+ menu.append(TortoiseMenuSep())
+
+ menu.append(TortoiseMenu(_("Synchronize..."),
+ _("Synchronize with remote repository"),
+ self.handlers._synch, icon="menusynch.ico"))
+ menu.append(TortoiseMenu(_("Recovery..."),
+ _("General repair and recovery of repository"),
+ self.handlers._recovery, icon="general.ico"))
+ menu.append(TortoiseMenu(_("Web Server"),
+ _("start web server for this repository"),
+ self.handlers._serve, icon="proxy.ico"))
+
+ menu.append(TortoiseMenuSep())
+ menu.append(TortoiseMenu(_("Create Clone"),
+ _("Clone a repository here"),
+ self.handlers._clone, icon="menuclone.ico"))
+ can_init = repo.root != rpath and os.path.isdir(rpath)
+ menu.append(TortoiseMenu(_("Create Repository Here"),
+ _("create a new repository in this directory"),
+ self.handlers._init, icon="menucreaterepos.ico",
+ state=can_init))
+
+ # config settings menu
+ menu.append(TortoiseMenuSep())
+ optmenu = TortoiseSubmenu(_("Settings"), '',
+ icon="menusettings.ico")
+ optmenu.add_menu(_("Global"),
+ _("Configure user wide settings"),
+ self.handlers._config_user, icon="settings_user.ico")
+ if repo:
+ optmenu.add_menu(_("Repository"),
+ _("Configure settings local to this repository"),
+ self.handlers._config_repo,
+ icon="settings_repo.ico")
+ menu.append(optmenu)
+
+ # add common menu items
+ menu.append(TortoiseMenuSep())
+ menu.append(TortoiseMenu(_("About"), _("About TortoiseHg"),
+ self.handlers._about, icon="menuabout.ico"))
+
+ thgmenu.append(menu)
+ thgmenu.append(TortoiseMenuSep())
+ return thgmenu
+
|
Loading...