Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
 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))
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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)