def makeMenu(self, selrows): self.selrows = selrows repo, menu = self.repo, self.menu alltypes = set() for types, wfile in selrows: alltypes |= types menu.clear() addedActions = False for action in self.allactions: if action is None: if addedActions: menu.addSeparator() addedActions = False elif action._filetypes & alltypes: menu.addAction(action) addedActions = True def make(text, func, types, icon=None): if not types & alltypes: return action = menu.addAction(text) action._filetypes = types action._runfunc = func if icon: action.setIcon(qtlib.getmenuicon(icon)) action.triggered.connect(self.runAction) if len(repo.parents()) > 1: make(_('View other'), viewother, frozenset('MA')) if len(selrows) == 1: menu.addSeparator() make(_('&Copy...'), copy, frozenset('MC'), 'edit-copy') make(_('Rename...'), rename, frozenset('MC'), 'hg-rename') # Add 'was renamed from' actions for unknown files t, path = selrows[0] wctx = self.repo[None] if t & frozenset('?') and wctx.deleted(): rmenu = QMenu(_('Was renamed from'), self.parent()) for d in wctx.deleted()[:15]: def mkaction(deleted): a = rmenu.addAction(hglib.tounicode(deleted)) a.triggered.connect( lambda: renamefromto(repo, deleted, path)) mkaction(d) menu.addSeparator() menu.addMenu(rmenu) # Add restart merge actions for resolved files if alltypes & frozenset('u'): f = make(_('Restart Merge...'), resolve, frozenset('u')) files = [f for t, f in selrows if 'u' in t] rmenu = QMenu(_('Restart merge with'), self.parent()) for tool in hglib.mergetools(repo.ui): def mkaction(rtool): a = rmenu.addAction(hglib.tounicode(rtool)) a.triggered.connect( lambda: resolve_with(rtool, repo, files)) mkaction(tool) menu.addSeparator() menu.addMenu(rmenu) return menu
def makeMenu(self, selrows): self.selrows = selrows repo, menu = self.repo, self.menu alltypes = set() for types, wfile in selrows: alltypes |= types menu.clear() addedActions = False for action in self.allactions: if action is None: if addedActions: menu.addSeparator() addedActions = False elif action._filetypes & alltypes: menu.addAction(action) addedActions = True def make(text, func, types=None, icon=None, inmenu=None, slot=self.runAction): if not types & alltypes: return if inmenu is None: inmenu = menu action = inmenu.addAction(text) action._filetypes = types action._runfunc = func if icon: action.setIcon(qtlib.geticon(icon)) if func is not None: action.triggered.connect(slot) return action if len(repo.parents()) > 1: make(_('View O&ther'), viewother, frozenset('MA')) if len(selrows) == 1: menu.addSeparator() make(_('&Copy...'), copy, frozenset('MC'), 'edit-copy', slot=self.runDialogAction) make(_('Re&name...'), rename, frozenset('MC'), 'hg-rename', slot=self.runDialogAction) menu.addSeparator() customtools.addCustomToolsSubmenu(menu, repo.ui, location='workbench.commit.custom-menu', make=make, slot=self._runCustomCommandByMenu) # Add 'was renamed from' actions for unknown files t, path = selrows[0] wctx = self.repo[None] if t & frozenset('?') and wctx.deleted(): rmenu = QMenu(_('Was renamed from'), self.parent()) for d in wctx.deleted()[:15]: def mkaction(deleted): a = rmenu.addAction(hglib.tounicode(deleted)) a.triggered.connect(lambda: renamefromto(repo, deleted, path)) mkaction(d) menu.addSeparator() menu.addMenu(rmenu) # Add restart merge actions for resolved files if alltypes & frozenset('u'): f = make(_('Restart Mer&ge'), resolve, frozenset('u')) files = [f for t, f in selrows if 'u' in t] rmenu = QMenu(_('Restart Merge &with'), self.parent()) for tool in hglib.mergetools(repo.ui): def mkaction(rtool): a = rmenu.addAction(hglib.tounicode(rtool)) a.triggered.connect(lambda: resolve_with(rtool, repo, files)) mkaction(tool) menu.addSeparator() menu.addMenu(rmenu) return menu
def _populateRemergeFileMenu(self): menu = self.sender() assert isinstance(menu, QMenu) menu.aboutToShow.disconnect(self._populateRemergeFileMenu) for tool in hglib.mergetools(self._ui): menu.addAction(hglib.tounicode(tool))
def makeMenu(self, selrows): self.selrows = selrows repo, menu = self.repo, self.menu alltypes = set() for types, wfile in selrows: alltypes |= types menu.clear() addedActions = False for action in self.allactions: if action is None: if addedActions: menu.addSeparator() addedActions = False elif action._filetypes & alltypes: menu.addAction(action) addedActions = True def make(text, func, types, icon=None): if not types & alltypes: return action = menu.addAction(text) action._filetypes = types action._runfunc = func if icon: action.setIcon(qtlib.getmenuicon(icon)) action.triggered.connect(self.runAction) if len(repo.parents()) > 1: make(_("View other"), viewother, frozenset("MA")) if len(selrows) == 1: menu.addSeparator() make(_("&Copy..."), copy, frozenset("MC"), "edit-copy") make(_("Rename..."), rename, frozenset("MC"), "hg-rename") # Add 'was renamed from' actions for unknown files t, path = selrows[0] wctx = self.repo[None] if t & frozenset("?") and wctx.deleted(): rmenu = QMenu(_("Was renamed from"), self.parent()) for d in wctx.deleted()[:15]: def mkaction(deleted): a = rmenu.addAction(hglib.tounicode(deleted)) a.triggered.connect(lambda: renamefromto(repo, deleted, path)) mkaction(d) menu.addSeparator() menu.addMenu(rmenu) # Add restart merge actions for resolved files if alltypes & frozenset("u"): f = make(_("Restart Merge..."), resolve, frozenset("u")) files = [f for t, f in selrows if "u" in t] rmenu = QMenu(_("Restart merge with"), self.parent()) for tool in hglib.mergetools(repo.ui): def mkaction(rtool): a = rmenu.addAction(hglib.tounicode(rtool)) a.triggered.connect(lambda: resolve_with(rtool, repo, files)) mkaction(tool) menu.addSeparator() menu.addMenu(rmenu) return menu
def tree_popup_menu(self, treeview): model, tpaths = treeview.get_selection().get_selected_rows() types = {'M':[], 'A':[], 'R':[], '!':[], 'I':[], '?':[], 'C':[], 'r':[], 'u':[], 'S':[]} all = [] pathmap = {} for p in tpaths: row = model[p] file = util.pconvert(row[FM_PATH]) ms = row[FM_MERGE_STATUS] if ms == 'R': types['r'].append(file) elif ms == 'U': types['u'].append(file) else: types[row[FM_STATUS]].append(file) all.append(file) pathmap[file] = p def make(label, func, stats, icon=None, sens=True, paths=False): files = [] for t in stats: files.extend(types[t]) if not files: return args = [files] if paths: p = [pathmap[f] for f in files] args.append(p) item = menu.append(label, func, icon, args=args, sensitive=sens) return files def vdiff(menuitem, files): self._do_diff(files, self.opts) def viewmissing(menuitem, files): self._view_files(files, True) def edit(menuitem, files): self._view_files(files, False) def other(menuitem, files): self._view_files(files, True) def revert(menuitem, files): self.act.hg_revert(files) def remove(menuitem, files): self.act.hg_remove(files) def log(menuitem, files): from tortoisehg.hgtk import history dlg = history.run(self.ui, canonpats=files) dlg.display() def annotate(menuitem, files): from tortoisehg.hgtk import datamine dlg = datamine.run(self.ui, *files) dlg.display() def forget(menuitem, files, paths): self.act.hg_forget(files) self.set_file_states(paths, state=False) def add(menuitem, files, paths): self.act.hg_add(files) self.set_file_states(paths, state=True) def delete(menuitem, files): self.act.delete_files(files) def unmark(menuitem, files): ms = merge_.mergestate(self.repo) for wfile in files: ms.mark(wfile, "u") ms.commit() self.reload_status() def mark(menuitem, files): ms = merge_.mergestate(self.repo) for wfile in files: ms.mark(wfile, "r") ms.commit() self.reload_status() def resolve(stat, files): wctx = self.repo[None] mctx = wctx.parents()[-1] ms = merge_.mergestate(self.repo) for wfile in files: ms.resolve(wfile, wctx, mctx) ms.commit() self.reload_status() def resolve_with(stat, tool, files): if tool: exe = filemerge._findtool(self.repo.ui, tool) oldmergeenv = os.environ.get('HGMERGE') os.environ['HGMERGE'] = exe resolve(stat, files) if tool: if oldmergeenv: os.environ['HGMERGE'] = oldmergeenv else: del os.environ['HGMERGE'] def rename(menuitem, files): self.act.rename_file(files[0]) def copy(menuitem, files): self.act.copy_file(files[0]) def guess_rename(menuitem, files): dlg = guess.DetectRenameDialog() dlg.show_all() dlg.set_notify_func(self.ignoremask_updated) def ignore(menuitem, files): dlg = hgignore.HgIgnoreDialog(files[0]) dlg.show_all() dlg.set_notify_func(self.ignoremask_updated) menu = gtklib.MenuBuilder() make(_('_Visual Diff'), vdiff, 'MAR!ru', gtk.STOCK_JUSTIFY_FILL) make(_('Edit'), edit, 'MACI?ru', gtk.STOCK_EDIT) make(_('View missing'), viewmissing, 'R!') make(_('View other'), other, 'MAru', None, self.is_merge()) menu.append_sep() make(_('_Revert'), revert, 'MAR!ru', gtk.STOCK_MEDIA_REWIND) make(_('_Add'), add, 'R', gtk.STOCK_ADD, paths=True) menu.append_sep() make(_('File History'), log, 'MARC!ru', 'menulog.ico') make(_('Annotate'), annotate, 'MARC!ru', 'menublame.ico') menu.append_sep() make(_('_Forget'), forget, 'MAC!ru', gtk.STOCK_CLEAR, paths=True) make(_('_Add'), add, 'I?', gtk.STOCK_ADD, paths=True) make(_('_Guess Rename...'), guess_rename, 'A?!', 'detect_rename.ico') make(_('_Ignore'), ignore, '?', 'ignore.ico') make(_('Remove versioned'), remove, 'C', 'menudelete.ico') make(_('_Delete unversioned'), delete, '?I', gtk.STOCK_DELETE) if len(all) == 1: menu.append_sep() make(_('_Copy...'), copy, 'MC', gtk.STOCK_COPY) make(_('Rename...'), rename, 'MC', 'general.ico') menu.append_sep() f = make(_('Restart Merge...'), resolve, 'u', 'menumerge.ico') make(_('Mark unresolved'), unmark, 'r', gtk.STOCK_NO) make(_('Mark resolved'), mark, 'u', gtk.STOCK_YES) if f: rmenu = gtk.Menu() for tool in hglib.mergetools(self.repo.ui): item = gtk.MenuItem(tool, True) item.connect('activate', resolve_with, tool, f) item.set_border_width(1) rmenu.append(item) menu.append_submenu(_('Restart merge with'), rmenu, 'menumerge.ico') for label, func, stats, icon in self.get_custom_menus(): make(label, func, stats, icon) menu = menu.build() if len(menu.get_children()) > 0: menu.show_all() menu.popup(None, None, None, 0, 0) return True
def get_body(self, vbox): rev0, rev1 = self.revs prevs = [ctx.rev() for ctx in self.repo.parents()] if len(prevs) > 1: rev0, rev1 = prevs elif (not rev1 and rev1 != 0): gdialog.Prompt(_('Unable to merge'), _('Must supply a target revision'), self).run() gtklib.idle_add_single_call(self.hide) return False elif (not rev0 and rev0 != 0): rev0 = prevs[0] elif rev1 == prevs[0]: # selected pair was backwards rev0, rev1 = rev1, rev0 elif rev0 != prevs[0]: # working parent not in selected revision pair modified, added, removed, deleted = self.repo.status()[:4] if modified or added or removed or deleted: gdialog.Prompt(_('Unable to merge'), _('Outstanding uncommitted changes'), self).run() gtklib.idle_add_single_call(self.hide) return False self.repo.ui.quiet = True commands.update(self.repo.ui, self.repo, rev=str(rev0), check=True) self.repo.ui.quiet = False # changeset info style = csinfo.panelstyle(contents=csinfo.PANEL_DEFAULT + ('ishead',), margin=5, padding=2) def markup_func(widget, item, value): if item == 'ishead' and value is False: text = _('Not a head revision!') return gtklib.markup(text, weight='bold') raise csinfo.UnknownItem(item) custom = csinfo.custom(markup=markup_func) factory = csinfo.factory(self.repo, custom, style, withupdate=True) info = factory(rev1, style={'label': _('Merge target (other)')}) self.vbox.pack_start(info, False, False) self.otherframe = info self.otherrev = str(info.get_data('revnum')) info = factory(rev0, style={'label': _('Current revision (local)')}) self.vbox.pack_start(info, False, False) self.localframe = info self.localrev = str(info.get_data('revnum')) # expander for advanced options expander = gtk.Expander(_('Advanced options')) self.vbox.pack_start(expander, False, False) # layout table for advanced options table = gtklib.LayoutTable() expander.add(table) vlist = gtk.ListStore(str, # tool name bool) # separator combo = gtk.ComboBoxEntry(vlist, 0) self.mergetool = combo combo.set_row_separator_func(lambda model, path: model[path][1]) combo.child.set_width_chars(16) chtool = gtk.RadioButton(None, _('Use merge tool:')) self.mergelabel = chtool table.add_row(chtool, combo) prev = False for tool in hglib.mergetools(self.repo.ui): cur = tool.startswith('internal:') vlist.append((hglib.toutf(tool), prev != cur)) prev = cur mtool = self.repo.ui.config('ui', 'merge', None) if mtool: combo.child.set_text(hglib.toutf(mtool)) else: combo.child.set_text('') discard = gtk.RadioButton(chtool, _('Discard all changes from merge target (other) revision')) self.discard = discard table.add_row(discard) # prepare to show if len(self.repo.parents()) == 2: self.mergetool.set_sensitive(False) self.mergelabel.set_sensitive(False) self.discard.set_sensitive(False) self.buttons['merge'].set_sensitive(False) self.buttons['commit'].set_sensitive(True) self.buttons['undo'].set_sensitive(True) else: self.buttons['commit'].set_sensitive(False) self.buttons['undo'].set_sensitive(False)