def RevPanelWidget(repo): '''creates a rev panel widget and returns it''' custom = csinfo.custom(data=data_func, label=label_func, markup=markup_func) style = csinfo.panelstyle(contents=('cset', 'branch', 'close', 'user', 'dateage', 'parents', 'children', 'tags', 'transplant', 'p4', 'svn'), selectable=True, expandable=True) return csinfo.create(repo, style=style, custom=custom)
def RevPanelWidget(repo): '''creates a rev panel widget and returns it''' custom = csinfo.custom(data=data_func, label=label_func, markup=create_markup_func(repo.ui)) style = csinfo.panelstyle(contents=('cset', 'branch', 'obsolete', 'close', 'user', 'dateage', 'parents', 'children', 'tags', 'graft', 'transplant', 'mqoriginalparent', 'precursors', 'successors', 'p4', 'svn', 'converted'), selectable=True, expandable=True) return csinfo.create(repo, style=style, custom=custom)
def RevPanelWidget(repo): '''creates a rev panel widget and returns it''' custom = csinfo.custom(data=data_func, label=label_func, markup=markup_func) style = csinfo.panelstyle(contents=('cset', 'branch', 'close', 'user', 'dateage', 'parents', 'children', 'tags', 'graft', 'transplant', 'p4', 'svn', 'converted'), selectable=True, expandable=True) return csinfo.create(repo, style=style, custom=custom)
def __init__(self, repo=None, parent=None): super(ChangesetList, self).__init__(parent) self.currepo = repo self.curitems = None self.curfactory = None self.showitems = None self.limit = 20 contents = ('%(item_l)s:', ' %(branch)s', ' %(tags)s', ' %(summary)s') self.lstyle = csinfo.labelstyle(contents=contents, width=350, selectable=True) contents = ('item', 'summary', 'user', 'dateage', 'rawbranch', 'tags', 'graft', 'transplant', 'p4', 'svn', 'converted') self.pstyle = csinfo.panelstyle(contents=contents, width=350, selectable=True) # main layout self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.mainvbox = QVBoxLayout() self.mainvbox.setSpacing(_SPACING) self.mainvbox.setSizeConstraint(QLayout.SetMinAndMaxSize) self.setLayout(self.mainvbox) ## status box self.statusbox = QHBoxLayout() self.statuslabel = QLabel(_('No items to display')) self.compactchk = QCheckBox(_('Use compact view')) self.statusbox.addWidget(self.statuslabel) self.statusbox.addWidget(self.compactchk) self.mainvbox.addLayout(self.statusbox) ## scroll area self.scrollarea = QScrollArea() self.scrollarea.setMinimumSize(400, 200) self.scrollarea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.scrollarea.setWidgetResizable(True) self.mainvbox.addWidget(self.scrollarea) ### cs layout grid, contains Factory objects, one per revision self.scrollbox = QWidget() self.csvbox = QVBoxLayout() self.csvbox.setSpacing(_SPACING) self.csvbox.setSizeConstraint(QLayout.SetMaximumSize) self.scrollbox.setLayout(self.csvbox) self.scrollarea.setWidget(self.scrollbox) # signal handlers self.compactchk.toggled.connect(self._updateView) # csetinfo def datafunc(widget, item, ctx): if item in ('item', 'item_l'): if not isinstance(ctx, patchctx): return True revid = widget.get_data('revid') if not revid: return widget.target filename = os.path.basename(widget.target) return filename, revid raise csinfo.UnknownItem(item) def labelfunc(widget, item, ctx): if item in ('item', 'item_l'): if not isinstance(ctx, patchctx): return _('Revision:') return _('Patch:') raise csinfo.UnknownItem(item) def markupfunc(widget, item, value): if item in ('item', 'item_l'): if not isinstance(widget.ctx, patchctx): if item == 'item': return widget.get_markup('rev') return widget.get_markup('revnum') mono = dict(face='monospace', size='9000') if isinstance(value, basestring): return qtlib.markup(value, **mono) filename = qtlib.markup(value[0]) revid = qtlib.markup(value[1], **mono) if item == 'item': return '%s (%s)' % (filename, revid) return filename raise csinfo.UnknownItem(item) self.custom = csinfo.custom(data=datafunc, label=labelfunc, markup=markupfunc)
def __init__(self, repoagent, parent): super(CommitPage, self).__init__(repoagent, parent) self.commitComplete = False self.setTitle(_('Commit backout and merge results')) self.setSubTitle(' ') self.setLayout(QVBoxLayout()) self.setCommitPage(True) repo = repoagent.rawRepo() # csinfo def label_func(widget, item, ctx): if item == 'rev': return _('Revision:') elif item == 'parents': return _('Parents') raise csinfo.UnknownItem() def data_func(widget, item, ctx): if item == 'rev': return _('Working Directory'), str(ctx) elif item == 'parents': parents = [] cbranch = ctx.branch() for pctx in ctx.parents(): branch = None if hasattr(pctx, 'branch') and pctx.branch() != cbranch: branch = pctx.branch() parents.append((str(pctx.rev()), str(pctx), branch, pctx)) return parents raise csinfo.UnknownItem() def markup_func(widget, item, value): if item == 'rev': text, rev = value if self.wizard() and self.wizard().parentbackout: return '%s (%s)' % (text, rev) else: return '<a href="view">%s</a> (%s)' % (text, rev) elif item == 'parents': def branch_markup(branch): opts = dict(fg='black', bg='#aaffaa') return qtlib.markup(' %s ' % branch, **opts) csets = [] for rnum, rid, branch, pctx in value: line = '%s (%s)' % (rnum, rid) if branch: line = '%s %s' % (line, branch_markup(branch)) msg = widget.info.get_data('summary', widget, pctx, widget.custom) if msg: line = '%s %s' % (line, msg) csets.append(line) return csets raise csinfo.UnknownItem() custom = csinfo.custom(label=label_func, data=data_func, markup=markup_func) contents = ('rev', 'user', 'dateage', 'branch', 'parents') style = csinfo.panelstyle(contents=contents, margin=6) # merged files rev_sep = qtlib.LabeledSeparator(_('Working Directory (merged)')) self.layout().addWidget(rev_sep) bkCsInfo = csinfo.create(repo, None, style, custom=custom, withupdate=True) bkCsInfo.linkActivated.connect(self.onLinkActivated) self.layout().addWidget(bkCsInfo) # commit message area msg_sep = qtlib.LabeledSeparator(_('Commit message')) self.layout().addWidget(msg_sep) msgEntry = messageentry.MessageEntry(self) msgEntry.installEventFilter(qscilib.KeyPressInterceptor(self)) msgEntry.refresh(repo) msgEntry.loadSettings(QSettings(), 'backout/message') msgEntry.textChanged.connect(self.completeChanged) self.layout().addWidget(msgEntry) self.msgEntry = msgEntry self.cmd = cmdui.Widget(True, False, self) self.cmd.commandFinished.connect(self.onCommandFinished) self.cmd.setShowOutput(False) self.layout().addWidget(self.cmd) def tryperform(): if self.isComplete(): self.wizard().next() actionEnter = QAction('alt-enter', self) actionEnter.setShortcuts( [Qt.CTRL + Qt.Key_Return, Qt.CTRL + Qt.Key_Enter]) actionEnter.triggered.connect(tryperform) self.addAction(actionEnter) self.skiplast = QCheckBox( _('Skip final confirmation page, ' 'close after commit.')) checked = QSettings().value('backout/skiplast', False).toBool() self.skiplast.setChecked(checked) self.layout().addWidget(self.skiplast) def eng_toggled(checked): if self.isComplete(): oldmsg = self.msgEntry.text() if self.wizard().backoutmergeparentrev: msgset = i18n.keepgettext()._( 'Backed out merge changeset: ') else: msgset = i18n.keepgettext()._('Backed out changeset: ') msg = checked and msgset['id'] or msgset['str'] if oldmsg and oldmsg != msg: if not qtlib.QuestionMsgBox( _('Confirm Discard Message'), _('Discard current backout message?'), parent=self): self.engChk.blockSignals(True) self.engChk.setChecked(not checked) self.engChk.blockSignals(False) return self.msgEntry.setText(msg + str(self.repo[self.wizard().backoutrev])) self.msgEntry.moveCursorToEnd() self.engChk = QCheckBox(_('Use English backout message')) self.engChk.toggled.connect(eng_toggled) engmsg = self.repo.ui.configbool('tortoisehg', 'engmsg', False) self.engChk.setChecked(engmsg) self.layout().addWidget(self.engChk)
def initializePage(self): if self.layout(): return self.setTitle(_('Prepare to backout')) self.setSubTitle( _('Verify backout revision and ensure your working ' 'directory is clean.')) self.setLayout(QVBoxLayout()) self.groups = qtlib.WidgetGroups() repo = self.repo try: bctx = repo[self.wizard().backoutrev] pctx = repo['.'] except error.RepoLookupError: qtlib.InfoMsgBox(_('Unable to backout'), _('Backout revision not found')) QTimer.singleShot(0, self.wizard().close) return if pctx == bctx: lbl = _('Backing out a parent revision is a single step operation') self.layout().addWidget(QLabel(u'<b>%s</b>' % lbl)) self.wizard().parentbackout = True op1, op2 = repo.dirstate.parents() if op1 is None: qtlib.InfoMsgBox(_('Unable to backout'), _('Backout requires a parent revision')) QTimer.singleShot(0, self.wizard().close) return a = repo.changelog.ancestor(op1, bctx.node()) if a != bctx.node(): qtlib.InfoMsgBox(_('Unable to backout'), _('Cannot backout change on a different branch')) QTimer.singleShot(0, self.wizard().close) ## backout revision style = csinfo.panelstyle(contents=csinfo.PANEL_DEFAULT) create = csinfo.factory(repo, None, style, withupdate=True) sep = qtlib.LabeledSeparator(_('Backout revision')) self.layout().addWidget(sep) backoutCsInfo = create(bctx.rev()) self.layout().addWidget(backoutCsInfo) ## current revision contents = ('ishead', ) + csinfo.PANEL_DEFAULT style = csinfo.panelstyle(contents=contents) def markup_func(widget, item, value): if item == 'ishead' and value is False: text = _('Not a head, backout will create a new head!') return qtlib.markup(text, fg='red', weight='bold') raise csinfo.UnknownItem(item) custom = csinfo.custom(markup=markup_func) create = csinfo.factory(repo, custom, style, withupdate=True) sep = qtlib.LabeledSeparator(_('Current local revision')) self.layout().addWidget(sep) localCsInfo = create(pctx.rev()) self.layout().addWidget(localCsInfo) self.localCsInfo = localCsInfo ## Merge revision backout handling if len(bctx.parents()) > 1: # Show two radio buttons letting the user which merge revision # parent to backout to p1rev = bctx.p1().rev() p2rev = bctx.p2().rev() def setBackoutMergeParentRev(rev): self.wizard().backoutmergeparentrev = rev setBackoutMergeParentRev(p1rev) sep = qtlib.LabeledSeparator(_('Merge parent to backout to')) self.layout().addWidget(sep) self.layout().addWidget( QLabel( _('To backout a <b>merge</b> revision you must select which ' 'parent to backout to ' '(i.e. whose changes will be <i>kept</i>)'))) self.actionFirstParent = QRadioButton( _('First Parent: revision %s (%s)') \ % (p1rev, str(bctx.p1())), self) self.actionFirstParent.setCheckable(True) self.actionFirstParent.setChecked(True) self.actionFirstParent.setShortcut('CTRL+1') self.actionFirstParent.setToolTip( _('Backout to the first parent of the merge revision')) self.actionFirstParent.clicked.connect( lambda: setBackoutMergeParentRev(p1rev)) self.actionSecondParent = QRadioButton( _('Second Parent: revision %s (%s)') % (p2rev, str(bctx.p2())), self) self.actionSecondParent.setCheckable(True) self.actionSecondParent.setShortcut('CTRL+2') self.actionSecondParent.setToolTip( _('Backout to the second parent of the merge revision')) self.actionSecondParent.clicked.connect( lambda: setBackoutMergeParentRev(p2rev)) self.layout().addWidget(self.actionFirstParent) self.layout().addWidget(self.actionSecondParent) ## working directory status sep = qtlib.LabeledSeparator(_('Working directory status')) self.layout().addWidget(sep) wdbox = QHBoxLayout() self.layout().addLayout(wdbox) self.wd_status = qtlib.StatusLabel() self.wd_status.set_status(_('Checking...')) wdbox.addWidget(self.wd_status) wd_prog = QProgressBar() wd_prog.setMaximum(0) wd_prog.setTextVisible(False) self.groups.add(wd_prog, 'prog') wdbox.addWidget(wd_prog, 1) text = _( 'Before backout, you must <a href="commit"><b>commit</b></a>, ' '<a href="shelve"><b>shelve</b></a> to patch, ' 'or <a href="discard"><b>discard</b></a> changes.') wd_text = QLabel(text) wd_text.setWordWrap(True) wd_text.linkActivated.connect(self.onLinkActivated) self.wd_text = wd_text self.groups.add(wd_text, 'dirty') self.layout().addWidget(wd_text) ## auto-resolve autoresolve_chk = QCheckBox( _('Automatically resolve merge conflicts ' 'where possible')) autoresolve_chk.setChecked( repo.ui.configbool('tortoisehg', 'autoresolve', False)) self.registerField('autoresolve', autoresolve_chk) self.layout().addWidget(autoresolve_chk) self.autoresolve_chk = autoresolve_chk self.groups.set_visible(False, 'dirty')
def ParentWidget(repo): 'creates a parent rev widget and returns it' custom = csinfo.custom(data=data_func, label=label_func, markup=nomarkup) style = csinfo.panelstyle(contents=('parents', 'ishead', 'isclose'), selectable=True) return csinfo.create(repo, style=style, custom=custom)
def __init__(self, repoagent, parent): super(CommitPage, self).__init__(repoagent, parent) self.setTitle(_('Commit merge results')) self.setSubTitle(' ') self.setLayout(QVBoxLayout()) self.setCommitPage(True) repo = repoagent.rawRepo() # csinfo def label_func(widget, item, ctx): if item == 'rev': return _('Revision:') elif item == 'parents': return _('Parents') raise csinfo.UnknownItem() def data_func(widget, item, ctx): if item == 'rev': return _('Working Directory'), str(ctx) elif item == 'parents': parents = [] cbranch = ctx.branch() for pctx in ctx.parents(): branch = None if hasattr(pctx, 'branch') and pctx.branch() != cbranch: branch = pctx.branch() parents.append((str(pctx.rev()), str(pctx), branch, pctx)) return parents raise csinfo.UnknownItem() def markup_func(widget, item, value): if item == 'rev': text, rev = value return '<a href="view">%s</a> (%s)' % (text, rev) elif item == 'parents': def branch_markup(branch): opts = dict(fg='black', bg='#aaffaa') return qtlib.markup(' %s ' % branch, **opts) csets = [] for rnum, rid, branch, pctx in value: line = '%s (%s)' % (rnum, rid) if branch: line = '%s %s' % (line, branch_markup(branch)) msg = widget.info.get_data('summary', widget, pctx, widget.custom) if msg: line = '%s %s' % (line, msg) csets.append(line) return csets raise csinfo.UnknownItem() custom = csinfo.custom(label=label_func, data=data_func, markup=markup_func) contents = ('rev', 'user', 'dateage', 'branch', 'parents') style = csinfo.panelstyle(contents=contents, margin=6) # merged files rev_sep = qtlib.LabeledSeparator(_('Working Directory (merged)')) self.layout().addWidget(rev_sep) mergeCsInfo = csinfo.create(repo, None, style, custom=custom, withupdate=True) mergeCsInfo.linkActivated.connect(self.onLinkActivated) self.layout().addWidget(mergeCsInfo) self.mergeCsInfo = mergeCsInfo # commit message area msg_sep = qtlib.LabeledSeparator(_('Commit message')) self.layout().addWidget(msg_sep) msgEntry = messageentry.MessageEntry(self) msgEntry.installEventFilter(qscilib.KeyPressInterceptor(self)) msgEntry.refresh(repo) msgEntry.loadSettings(QSettings(), 'merge/message') msgEntry.textChanged.connect(self.completeChanged) self.layout().addWidget(msgEntry) self.msgEntry = msgEntry self._cmdsession = cmdcore.nullCmdSession() self._cmdlog = cmdui.LogWidget(self) self._cmdlog.hide() self.layout().addWidget(self._cmdlog) self.delayednext = False def tryperform(): if self.isComplete(): self.wizard().next() actionEnter = QAction('alt-enter', self) actionEnter.setShortcuts([Qt.CTRL+Qt.Key_Return, Qt.CTRL+Qt.Key_Enter]) actionEnter.triggered.connect(tryperform) self.addAction(actionEnter) skiplast = QCheckBox(_('Skip final confirmation page, ' 'close after commit.')) self.registerField('skiplast', skiplast) self.layout().addWidget(skiplast) hblayout = QHBoxLayout() self.opts = commit.readopts(self.repo.ui) self.optionsbtn = QPushButton(_('Commit Options')) self.optionsbtn.clicked.connect(self.details) hblayout.addWidget(self.optionsbtn) self.optionslabelfmt = _('<b>Selected Options:</b> %s') self.optionslabel = QLabel('') hblayout.addWidget(self.optionslabel) hblayout.addStretch() self.layout().addLayout(hblayout) self.setButtonText(QWizard.CommitButton, _('Commit Now')) # The cancel button does not really "cancel" the merge self.setButtonText(QWizard.CancelButton, _('Commit Later')) # Update the options label self.refresh()
def __init__(self, repoagent, otherrev, parent): super(SummaryPage, self).__init__(repoagent, parent) self._wctxcleaner = wctxcleaner.WctxCleaner(repoagent, self) self._wctxcleaner.checkStarted.connect(self._onCheckStarted) self._wctxcleaner.checkFinished.connect(self._onCheckFinished) self.setTitle(_('Prepare to merge')) self.setSubTitle(_('Verify merge targets and ensure your working ' 'directory is clean.')) self.setLayout(QVBoxLayout()) repo = self.repo contents = ('ishead',) + csinfo.PANEL_DEFAULT style = csinfo.panelstyle(contents=contents) def markup_func(widget, item, value): if item == 'ishead' and value is False: text = _('Not a head revision!') return qtlib.markup(text, fg='red', weight='bold') raise csinfo.UnknownItem(item) custom = csinfo.custom(markup=markup_func) create = csinfo.factory(repo, custom, style, withupdate=True) ## merge target other_sep = qtlib.LabeledSeparator(_('Merge from (other revision)')) self.layout().addWidget(other_sep) otherCsInfo = create(otherrev) self.layout().addWidget(otherCsInfo) self.otherCsInfo = otherCsInfo ## current revision local_sep = qtlib.LabeledSeparator(_('Merge to (working directory)')) self.layout().addWidget(local_sep) localCsInfo = create(str(repo['.'].rev())) self.layout().addWidget(localCsInfo) self.localCsInfo = localCsInfo ## working directory status wd_sep = qtlib.LabeledSeparator(_('Working directory status')) self.layout().addWidget(wd_sep) self.groups = qtlib.WidgetGroups() wdbox = QHBoxLayout() self.layout().addLayout(wdbox) self.wd_status = qtlib.StatusLabel() self.wd_status.set_status(_('Checking...')) wdbox.addWidget(self.wd_status) wd_prog = QProgressBar() wd_prog.setMaximum(0) wd_prog.setTextVisible(False) self.groups.add(wd_prog, 'prog') wdbox.addWidget(wd_prog, 1) wd_merged = QLabel(_('The working directory is already <b>merged</b>. ' '<a href="skip"><b>Continue</b></a> or ' '<a href="discard"><b>discard</b></a> existing ' 'merge.')) wd_merged.linkActivated.connect(self.onLinkActivated) wd_merged.setWordWrap(True) self.groups.add(wd_merged, 'merged') self.layout().addWidget(wd_merged) text = _('Before merging, you must <a href="commit"><b>commit</b></a>, ' '<a href="shelve"><b>shelve</b></a> to patch, ' 'or <a href="discard"><b>discard</b></a> changes.') wd_text = QLabel(text) wd_text.setWordWrap(True) wd_text.linkActivated.connect(self._wctxcleaner.runCleaner) self.wd_text = wd_text self.groups.add(wd_text, 'dirty') self.layout().addWidget(wd_text) wdbox = QHBoxLayout() self.layout().addLayout(wdbox) wd_alt = QLabel(_('Or use:')) self.groups.add(wd_alt, 'dirty') wdbox.addWidget(wd_alt) force_chk = QCheckBox(_('Force a merge with outstanding changes ' '(-f/--force)')) force_chk.toggled.connect(lambda c: self.completeChanged.emit()) self.registerField('force', force_chk) self.groups.add(force_chk, 'dirty') wdbox.addWidget(force_chk) ### discard option discard_chk = QCheckBox(_('Discard all changes from the other ' 'revision')) self.registerField('discard', discard_chk) self.layout().addWidget(discard_chk) ## auto-resolve autoresolve_chk = QCheckBox(_('Automatically resolve merge conflicts ' 'where possible')) self.registerField('autoresolve', autoresolve_chk) self.layout().addWidget(autoresolve_chk) self.groups.set_visible(False, 'dirty') self.groups.set_visible(False, 'merged')
def initializePage(self): if self.layout(): return self.setTitle(_('Prepare to merge')) self.setSubTitle( _('Verify merge targets and ensure your working ' 'directory is clean.')) self.setLayout(QVBoxLayout()) repo = self.repo contents = ('ishead', ) + csinfo.PANEL_DEFAULT style = csinfo.panelstyle(contents=contents) def markup_func(widget, item, value): if item == 'ishead' and value is False: text = _('Not a head revision!') return qtlib.markup(text, fg='red', weight='bold') raise csinfo.UnknownItem(item) custom = csinfo.custom(markup=markup_func) create = csinfo.factory(repo, custom, style, withupdate=True) ## merge target other_sep = qtlib.LabeledSeparator(_('Merge from (other revision)')) self.layout().addWidget(other_sep) try: otherCsInfo = create(self.wizard().otherrev) self.layout().addWidget(otherCsInfo) self.otherCsInfo = otherCsInfo except error.RepoLookupError: qtlib.InfoMsgBox(_('Unable to merge'), _('Merge revision not specified or not found')) QTimer.singleShot(0, self.wizard().close) ## current revision local_sep = qtlib.LabeledSeparator(_('Merge to (working directory)')) self.layout().addWidget(local_sep) localCsInfo = create(self.wizard().localrev) self.layout().addWidget(localCsInfo) self.localCsInfo = localCsInfo ## working directory status wd_sep = qtlib.LabeledSeparator(_('Working directory status')) self.layout().addWidget(wd_sep) self.groups = qtlib.WidgetGroups() wdbox = QHBoxLayout() self.layout().addLayout(wdbox) self.wd_status = qtlib.StatusLabel() self.wd_status.set_status(_('Checking...')) wdbox.addWidget(self.wd_status) wd_prog = QProgressBar() wd_prog.setMaximum(0) wd_prog.setTextVisible(False) self.groups.add(wd_prog, 'prog') wdbox.addWidget(wd_prog, 1) wd_merged = QLabel( _('The working directory is already <b>merged</b>. ' '<a href="skip"><b>Continue</b></a> or ' '<a href="discard"><b>discard</b></a> existing ' 'merge.')) wd_merged.linkActivated.connect(self.onLinkActivated) wd_merged.setWordWrap(True) self.groups.add(wd_merged, 'merged') self.layout().addWidget(wd_merged) text = _( 'Before merging, you must <a href="commit"><b>commit</b></a>, ' '<a href="shelve"><b>shelve</b></a> to patch, ' 'or <a href="discard"><b>discard</b></a> changes.') wd_text = QLabel(text) wd_text.setWordWrap(True) wd_text.linkActivated.connect(self.onLinkActivated) self.wd_text = wd_text self.groups.add(wd_text, 'dirty') self.layout().addWidget(wd_text) wdbox = QHBoxLayout() self.layout().addLayout(wdbox) wd_alt = QLabel(_('Or use:')) self.groups.add(wd_alt, 'dirty') wdbox.addWidget(wd_alt) force_chk = QCheckBox( _('Force a merge with outstanding changes ' '(-f/--force)')) force_chk.toggled.connect(lambda c: self.completeChanged.emit()) self.registerField('force', force_chk) self.groups.add(force_chk, 'dirty') wdbox.addWidget(force_chk) ### options expander = qtlib.ExpanderLabel(_('Options'), False) expander.expanded.connect(self.toggleShowOptions) self.layout().addWidget(expander) self.expander = expander ### discard option discard_chk = QCheckBox( _('Discard all changes from merge target ' '(other) revision')) self.registerField('discard', discard_chk) self.layout().addWidget(discard_chk) self.discard_chk = discard_chk ## auto-resolve autoresolve_chk = QCheckBox( _('Automatically resolve merge conflicts ' 'where possible')) autoresolve_chk.setChecked( repo.ui.configbool('tortoisehg', 'autoresolve', False)) self.registerField('autoresolve', autoresolve_chk) self.layout().addWidget(autoresolve_chk) self.autoresolve_chk = autoresolve_chk self.groups.set_visible(False, 'dirty') self.groups.set_visible(False, 'merged') self.toggleShowOptions(self.expander.is_expanded())
def __init__(self, repo=None, parent=None): super(ChangesetList, self).__init__() self.currepo = repo self.curitems = None self.curfactory = None self.showitems = None self.limit = 20 contents = ('%(item_l)s:', ' %(branch)s', ' %(tags)s', ' %(summary)s') self.lstyle = csinfo.labelstyle(contents=contents, width=350, selectable=True) contents = ('item', 'summary', 'user', 'dateage', 'rawbranch', 'tags', 'graft', 'transplant', 'p4', 'svn', 'converted') self.pstyle = csinfo.panelstyle(contents=contents, width=350, selectable=True) # main layout self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.mainvbox = QVBoxLayout() self.mainvbox.setSpacing(_SPACING) self.mainvbox.setSizeConstraint(QLayout.SetMinAndMaxSize) self.setLayout(self.mainvbox) ## status box self.statusbox = QHBoxLayout() self.statuslabel = QLabel(_('No items to display')) self.compactchk = QCheckBox(_('Use compact view')) self.statusbox.addWidget(self.statuslabel) self.statusbox.addWidget(self.compactchk) self.mainvbox.addLayout(self.statusbox) ## scroll area self.scrollarea = QScrollArea() self.scrollarea.setMinimumSize(400, 200) self.scrollarea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.scrollarea.setWidgetResizable(True) self.mainvbox.addWidget(self.scrollarea) ### cs layout grid, contains Factory objects, one per revision self.scrollbox = QWidget() self.csvbox = QVBoxLayout() self.csvbox.setSpacing(_SPACING) self.csvbox.setSizeConstraint(QLayout.SetMaximumSize) self.scrollbox.setLayout(self.csvbox) self.scrollarea.setWidget(self.scrollbox) # signal handlers self.compactchk.toggled.connect(lambda *a: self.update(self.curitems)) # csetinfo def datafunc(widget, item, ctx): if item in ('item', 'item_l'): if not isinstance(ctx, patchctx): return True revid = widget.get_data('revid') if not revid: return widget.target filename = os.path.basename(widget.target) return filename, revid raise csinfo.UnknownItem(item) def labelfunc(widget, item, ctx): if item in ('item', 'item_l'): if not isinstance(ctx, patchctx): return _('Revision:') return _('Patch:') raise csinfo.UnknownItem(item) def markupfunc(widget, item, value): if item in ('item', 'item_l'): if not isinstance(widget.ctx, patchctx): if item == 'item': return widget.get_markup('rev') return widget.get_markup('revnum') mono = dict(face='monospace', size='9000') if isinstance(value, basestring): return qtlib.markup(value, **mono) filename = qtlib.markup(value[0]) revid = qtlib.markup(value[1], **mono) if item == 'item': return '%s (%s)' % (filename, revid) return filename raise csinfo.UnknownItem(item) self.custom = csinfo.custom(data=datafunc, label=labelfunc, markup=markupfunc)
def initializePage(self): if self.layout(): return self.setTitle(_('Prepare to backout')) self.setSubTitle(_('Verify backout revision and ensure your working ' 'directory is clean.')) self.setLayout(QVBoxLayout()) self.groups = qtlib.WidgetGroups() repo = self.repo try: bctx = repo[self.wizard().backoutrev] pctx = repo['.'] except error.RepoLookupError: qtlib.InfoMsgBox(_('Unable to backout'), _('Backout revision not found')) QTimer.singleShot(0, self.wizard().close) return if pctx == bctx: lbl = _('Backing out a parent revision is a single step operation') self.layout().addWidget(QLabel(u'<b>%s</b>' % lbl)) self.wizard().parentbackout = True op1, op2 = repo.dirstate.parents() if op1 is None: qtlib.InfoMsgBox(_('Unable to backout'), _('Backout requires a parent revision')) QTimer.singleShot(0, self.wizard().close) return a = repo.changelog.ancestor(op1, bctx.node()) if a != bctx.node(): qtlib.InfoMsgBox(_('Unable to backout'), _('Cannot backout change on a different branch')) QTimer.singleShot(0, self.wizard().close) ## backout revision style = csinfo.panelstyle(contents=csinfo.PANEL_DEFAULT) create = csinfo.factory(repo, None, style, withupdate=True) sep = qtlib.LabeledSeparator(_('Backout revision')) self.layout().addWidget(sep) backoutCsInfo = create(bctx.rev()) self.layout().addWidget(backoutCsInfo) ## current revision contents = ('ishead',) + csinfo.PANEL_DEFAULT style = csinfo.panelstyle(contents=contents) def markup_func(widget, item, value): if item == 'ishead' and value is False: text = _('Not a head, backout will create a new head!') return qtlib.markup(text, fg='red', weight='bold') raise csinfo.UnknownItem(item) custom = csinfo.custom(markup=markup_func) create = csinfo.factory(repo, custom, style, withupdate=True) sep = qtlib.LabeledSeparator(_('Current local revision')) self.layout().addWidget(sep) localCsInfo = create(pctx.rev()) self.layout().addWidget(localCsInfo) self.localCsInfo = localCsInfo ## Merge revision backout handling if len(bctx.parents()) > 1: # Show two radio buttons letting the user which merge revision # parent to backout to p1rev = bctx.p1().rev() p2rev = bctx.p2().rev() def setBackoutMergeParentRev(rev): self.wizard().backoutmergeparentrev = rev setBackoutMergeParentRev(p1rev) sep = qtlib.LabeledSeparator(_('Merge parent to backout to')) self.layout().addWidget(sep) self.layout().addWidget(QLabel( _('To backout a <b>merge</b> revision you must select which ' 'parent to backout to ' '(i.e. whose changes will be <i>kept</i>)'))) self.actionFirstParent = QRadioButton( _('First Parent: revision %s (%s)') \ % (p1rev, str(bctx.p1())), self) self.actionFirstParent.setCheckable(True) self.actionFirstParent.setChecked(True) self.actionFirstParent.setShortcut('CTRL+1') self.actionFirstParent.setToolTip( _('Backout to the first parent of the merge revision')) self.actionFirstParent.clicked.connect( lambda: setBackoutMergeParentRev(p1rev)) self.actionSecondParent = QRadioButton( _('Second Parent: revision %s (%s)') % (p2rev, str(bctx.p2())), self) self.actionSecondParent.setCheckable(True) self.actionSecondParent.setShortcut('CTRL+2') self.actionSecondParent.setToolTip( _('Backout to the second parent of the merge revision')) self.actionSecondParent.clicked.connect( lambda: setBackoutMergeParentRev(p2rev)) self.layout().addWidget(self.actionFirstParent) self.layout().addWidget(self.actionSecondParent) ## working directory status sep = qtlib.LabeledSeparator(_('Working directory status')) self.layout().addWidget(sep) wdbox = QHBoxLayout() self.layout().addLayout(wdbox) self.wd_status = qtlib.StatusLabel() self.wd_status.set_status(_('Checking...')) wdbox.addWidget(self.wd_status) wd_prog = QProgressBar() wd_prog.setMaximum(0) wd_prog.setTextVisible(False) self.groups.add(wd_prog, 'prog') wdbox.addWidget(wd_prog, 1) text = _('Before backout, you must <a href="commit"><b>commit</b></a>, ' '<a href="shelve"><b>shelve</b></a> to patch, ' 'or <a href="discard"><b>discard</b></a> changes.') wd_text = QLabel(text) wd_text.setWordWrap(True) wd_text.linkActivated.connect(self.onLinkActivated) self.wd_text = wd_text self.groups.add(wd_text, 'dirty') self.layout().addWidget(wd_text) ## auto-resolve autoresolve_chk = QCheckBox(_('Automatically resolve merge conflicts ' 'where possible')) autoresolve_chk.setChecked( repo.ui.configbool('tortoisehg', 'autoresolve', False)) self.registerField('autoresolve', autoresolve_chk) self.layout().addWidget(autoresolve_chk) self.autoresolve_chk = autoresolve_chk self.groups.set_visible(False, 'dirty')
def __init__(self, repo, parent): super(CommitPage, self).__init__(repo, parent) self.commitComplete = False self.setTitle(_('Commit backout and merge results')) self.setSubTitle(' ') self.setLayout(QVBoxLayout()) self.setCommitPage(True) # csinfo def label_func(widget, item, ctx): if item == 'rev': return _('Revision:') elif item == 'parents': return _('Parents') raise csinfo.UnknownItem() def data_func(widget, item, ctx): if item == 'rev': return _('Working Directory'), str(ctx) elif item == 'parents': parents = [] cbranch = ctx.branch() for pctx in ctx.parents(): branch = None if hasattr(pctx, 'branch') and pctx.branch() != cbranch: branch = pctx.branch() parents.append((str(pctx.rev()), str(pctx), branch, pctx)) return parents raise csinfo.UnknownItem() def markup_func(widget, item, value): if item == 'rev': text, rev = value if self.wizard() and self.wizard().parentbackout: return '%s (%s)' % (text, rev) else: return '<a href="view">%s</a> (%s)' % (text, rev) elif item == 'parents': def branch_markup(branch): opts = dict(fg='black', bg='#aaffaa') return qtlib.markup(' %s ' % branch, **opts) csets = [] for rnum, rid, branch, pctx in value: line = '%s (%s)' % (rnum, rid) if branch: line = '%s %s' % (line, branch_markup(branch)) msg = widget.info.get_data('summary', widget, pctx, widget.custom) if msg: line = '%s %s' % (line, msg) csets.append(line) return csets raise csinfo.UnknownItem() custom = csinfo.custom(label=label_func, data=data_func, markup=markup_func) contents = ('rev', 'user', 'dateage', 'branch', 'parents') style = csinfo.panelstyle(contents=contents, margin=6) # merged files rev_sep = qtlib.LabeledSeparator(_('Working Directory (merged)')) self.layout().addWidget(rev_sep) bkCsInfo = csinfo.create(repo, None, style, custom=custom, withupdate=True) bkCsInfo.linkActivated.connect(self.onLinkActivated) self.layout().addWidget(bkCsInfo) # commit message area msg_sep = qtlib.LabeledSeparator(_('Commit message')) self.layout().addWidget(msg_sep) msgEntry = messageentry.MessageEntry(self) msgEntry.installEventFilter(qscilib.KeyPressInterceptor(self)) msgEntry.refresh(repo) msgEntry.loadSettings(QSettings(), 'backout/message') msgEntry.textChanged.connect(self.completeChanged) self.layout().addWidget(msgEntry) self.msgEntry = msgEntry self.cmd = cmdui.Widget(True, False, self) self.cmd.commandFinished.connect(self.onCommandFinished) self.cmd.setShowOutput(False) self.layout().addWidget(self.cmd) def tryperform(): if self.isComplete(): self.wizard().next() actionEnter = QAction('alt-enter', self) actionEnter.setShortcuts([Qt.CTRL+Qt.Key_Return, Qt.CTRL+Qt.Key_Enter]) actionEnter.triggered.connect(tryperform) self.addAction(actionEnter) self.skiplast = QCheckBox(_('Skip final confirmation page, ' 'close after commit.')) checked = QSettings().value('backout/skiplast', False).toBool() self.skiplast.setChecked(checked) self.layout().addWidget(self.skiplast) def eng_toggled(checked): if self.isComplete(): oldmsg = self.msgEntry.text() if self.wizard().backoutmergeparentrev: msgset = i18n.keepgettext()._( 'Backed out merge changeset: ') else: msgset = i18n.keepgettext()._('Backed out changeset: ') msg = checked and msgset['id'] or msgset['str'] if oldmsg and oldmsg != msg: if not qtlib.QuestionMsgBox(_('Confirm Discard Message'), _('Discard current backout message?'), parent=self): self.engChk.blockSignals(True) self.engChk.setChecked(not checked) self.engChk.blockSignals(False) return self.msgEntry.setText(msg + str(self.repo[self.wizard().backoutrev])) self.msgEntry.moveCursorToEnd() self.engChk = QCheckBox(_('Use English backout message')) self.engChk.toggled.connect(eng_toggled) engmsg = self.repo.ui.configbool('tortoisehg', 'engmsg', False) self.engChk.setChecked(engmsg) self.layout().addWidget(self.engChk)
def __init__(self, repoagent, parent): super(CommitPage, self).__init__(repoagent, parent) self.setTitle(_('Commit merge results')) self.setSubTitle(' ') self.setLayout(QVBoxLayout()) self.setCommitPage(True) repo = repoagent.rawRepo() # csinfo def label_func(widget, item, ctx): if item == 'rev': return _('Revision:') elif item == 'parents': return _('Parents') raise csinfo.UnknownItem() def data_func(widget, item, ctx): if item == 'rev': return _('Working Directory'), str(ctx) elif item == 'parents': parents = [] cbranch = ctx.branch() for pctx in ctx.parents(): branch = None if hasattr(pctx, 'branch') and pctx.branch() != cbranch: branch = pctx.branch() parents.append((str(pctx.rev()), str(pctx), branch, pctx)) return parents raise csinfo.UnknownItem() def markup_func(widget, item, value): if item == 'rev': text, rev = value return '<a href="view">%s</a> (%s)' % (text, rev) elif item == 'parents': def branch_markup(branch): opts = dict(fg='black', bg='#aaffaa') return qtlib.markup(' %s ' % branch, **opts) csets = [] for rnum, rid, branch, pctx in value: line = '%s (%s)' % (rnum, rid) if branch: line = '%s %s' % (line, branch_markup(branch)) msg = widget.info.get_data('summary', widget, pctx, widget.custom) if msg: line = '%s %s' % (line, msg) csets.append(line) return csets raise csinfo.UnknownItem() custom = csinfo.custom(label=label_func, data=data_func, markup=markup_func) contents = ('rev', 'user', 'dateage', 'branch', 'parents') style = csinfo.panelstyle(contents=contents, margin=6) # merged files rev_sep = qtlib.LabeledSeparator(_('Working Directory (merged)')) self.layout().addWidget(rev_sep) mergeCsInfo = csinfo.create(repo, None, style, custom=custom, withupdate=True) mergeCsInfo.linkActivated.connect(self.onLinkActivated) self.layout().addWidget(mergeCsInfo) self.mergeCsInfo = mergeCsInfo # commit message area msg_sep = qtlib.LabeledSeparator(_('Commit message')) self.layout().addWidget(msg_sep) msgEntry = messageentry.MessageEntry(self) msgEntry.installEventFilter(qscilib.KeyPressInterceptor(self)) msgEntry.refresh(repo) msgEntry.loadSettings(QSettings(), 'merge/message') msgEntry.textChanged.connect(self.completeChanged) self.layout().addWidget(msgEntry) self.msgEntry = msgEntry self.cmd = cmdui.Widget(True, False, self) self.cmd.commandFinished.connect(self.onCommandFinished) self.cmd.setShowOutput(False) self.layout().addWidget(self.cmd) self.delayednext = False def tryperform(): if self.isComplete(): self.wizard().next() actionEnter = QAction('alt-enter', self) actionEnter.setShortcuts( [Qt.CTRL + Qt.Key_Return, Qt.CTRL + Qt.Key_Enter]) actionEnter.triggered.connect(tryperform) self.addAction(actionEnter) self.skiplast = QCheckBox( _('Skip final confirmation page, ' 'close after commit.')) checked = QSettings().value('merge/skiplast', False).toBool() self.skiplast.setChecked(checked) self.layout().addWidget(self.skiplast) hblayout = QHBoxLayout() self.opts = commit.readrepoopts(self.repo) self.optionsbtn = QPushButton(_('Commit Options')) self.optionsbtn.clicked.connect(self.details) hblayout.addWidget(self.optionsbtn) self.optionslabelfmt = _('<b>Selected Options:</b> %s') self.optionslabel = QLabel('') hblayout.addWidget(self.optionslabel) hblayout.addStretch() self.layout().addLayout(hblayout) self.setButtonText(QWizard.CommitButton, _('Commit Now')) # The cancel button does not really "cancel" the merge self.setButtonText(QWizard.CancelButton, _('Commit Later')) # Update the options label self.refresh()
def initializePage(self): if self.layout(): return self.setTitle(_('Prepare to merge')) self.setSubTitle(_('Verify merge targets and ensure your working ' 'directory is clean.')) self.setLayout(QVBoxLayout()) repo = self.repo contents = ('ishead',) + csinfo.PANEL_DEFAULT style = csinfo.panelstyle(contents=contents) def markup_func(widget, item, value): if item == 'ishead' and value is False: text = _('Not a head revision!') return qtlib.markup(text, fg='red', weight='bold') raise csinfo.UnknownItem(item) custom = csinfo.custom(markup=markup_func) create = csinfo.factory(repo, custom, style, withupdate=True) ## merge target other_sep = qtlib.LabeledSeparator(_('Merge from (other revision)')) self.layout().addWidget(other_sep) try: otherCsInfo = create(self.wizard().otherrev) self.layout().addWidget(otherCsInfo) self.otherCsInfo = otherCsInfo except error.RepoLookupError: qtlib.InfoMsgBox(_('Unable to merge'), _('Merge revision not specified or not found')) QTimer.singleShot(0, self.wizard().close) ## current revision local_sep = qtlib.LabeledSeparator(_('Merge to (working directory)')) self.layout().addWidget(local_sep) localCsInfo = create(self.wizard().localrev) self.layout().addWidget(localCsInfo) self.localCsInfo = localCsInfo ## working directory status wd_sep = qtlib.LabeledSeparator(_('Working directory status')) self.layout().addWidget(wd_sep) self.groups = qtlib.WidgetGroups() wdbox = QHBoxLayout() self.layout().addLayout(wdbox) self.wd_status = qtlib.StatusLabel() self.wd_status.set_status(_('Checking...')) wdbox.addWidget(self.wd_status) wd_prog = QProgressBar() wd_prog.setMaximum(0) wd_prog.setTextVisible(False) self.groups.add(wd_prog, 'prog') wdbox.addWidget(wd_prog, 1) wd_merged = QLabel(_('The working directory is already <b>merged</b>. ' '<a href="skip"><b>Continue</b></a> or ' '<a href="discard"><b>discard</b></a> existing ' 'merge.')) wd_merged.linkActivated.connect(self.onLinkActivated) wd_merged.setWordWrap(True) self.groups.add(wd_merged, 'merged') self.layout().addWidget(wd_merged) text = _('Before merging, you must <a href="commit"><b>commit</b></a>, ' '<a href="shelve"><b>shelve</b></a> to patch, ' 'or <a href="discard"><b>discard</b></a> changes.') wd_text = QLabel(text) wd_text.setWordWrap(True) wd_text.linkActivated.connect(self.onLinkActivated) self.wd_text = wd_text self.groups.add(wd_text, 'dirty') self.layout().addWidget(wd_text) wdbox = QHBoxLayout() self.layout().addLayout(wdbox) wd_alt = QLabel(_('Or use:')) self.groups.add(wd_alt, 'dirty') wdbox.addWidget(wd_alt) force_chk = QCheckBox(_('Force a merge with outstanding changes ' '(-f/--force)')) force_chk.toggled.connect(lambda c: self.completeChanged.emit()) self.registerField('force', force_chk) self.groups.add(force_chk, 'dirty') wdbox.addWidget(force_chk) ### options expander = qtlib.ExpanderLabel(_('Options'), False) expander.expanded.connect(self.toggleShowOptions) self.layout().addWidget(expander) self.expander = expander ### discard option discard_chk = QCheckBox(_('Discard all changes from merge target ' '(other) revision')) self.registerField('discard', discard_chk) self.layout().addWidget(discard_chk) self.discard_chk = discard_chk ## auto-resolve autoresolve_chk = QCheckBox(_('Automatically resolve merge conflicts ' 'where possible')) autoresolve_chk.setChecked( repo.ui.configbool('tortoisehg', 'autoresolve', False)) self.registerField('autoresolve', autoresolve_chk) self.layout().addWidget(autoresolve_chk) self.autoresolve_chk = autoresolve_chk self.groups.set_visible(False, 'dirty') self.groups.set_visible(False, 'merged') self.toggleShowOptions(self.expander.is_expanded())
def __init__(self, repo, parent): super(CommitPage, self).__init__(repo, parent) self.setTitle(_('Commit merge results')) self.setSubTitle(' ') self.setLayout(QVBoxLayout()) self.setCommitPage(True) # csinfo def label_func(widget, item, ctx): if item == 'rev': return _('Revision:') elif item == 'parents': return _('Parents') raise csinfo.UnknownItem() def data_func(widget, item, ctx): if item == 'rev': return _('Working Directory'), str(ctx) elif item == 'parents': parents = [] cbranch = ctx.branch() for pctx in ctx.parents(): branch = None if hasattr(pctx, 'branch') and pctx.branch() != cbranch: branch = pctx.branch() parents.append((str(pctx.rev()), str(pctx), branch, pctx)) return parents raise csinfo.UnknownItem() def markup_func(widget, item, value): if item == 'rev': text, rev = value return '<a href="view">%s</a> (%s)' % (text, rev) elif item == 'parents': def branch_markup(branch): opts = dict(fg='black', bg='#aaffaa') return qtlib.markup(' %s ' % branch, **opts) csets = [] for rnum, rid, branch, pctx in value: line = '%s (%s)' % (rnum, rid) if branch: line = '%s %s' % (line, branch_markup(branch)) msg = widget.info.get_data('summary', widget, pctx, widget.custom) if msg: line = '%s %s' % (line, msg) csets.append(line) return csets raise csinfo.UnknownItem() custom = csinfo.custom(label=label_func, data=data_func, markup=markup_func) contents = ('rev', 'user', 'dateage', 'branch', 'parents') style = csinfo.panelstyle(contents=contents, margin=6) # merged files rev_sep = qtlib.LabeledSeparator(_('Working Directory (merged)')) self.layout().addWidget(rev_sep) mergeCsInfo = csinfo.create(repo, None, style, custom=custom, withupdate=True) mergeCsInfo.linkActivated.connect(self.onLinkActivated) self.layout().addWidget(mergeCsInfo) # commit message area msg_sep = qtlib.LabeledSeparator(_('Commit message')) self.layout().addWidget(msg_sep) msgEntry = messageentry.MessageEntry(self) msgEntry.installEventFilter(qscilib.KeyPressInterceptor(self)) msgEntry.refresh(repo) msgEntry.loadSettings(QSettings(), 'merge/message') msgEntry.textChanged.connect(self.completeChanged) self.layout().addWidget(msgEntry) self.msgEntry = msgEntry self.cmd = cmdui.Widget(True, False, self) self.cmd.commandFinished.connect(self.onCommandFinished) self.cmd.setShowOutput(False) self.layout().addWidget(self.cmd) self.delayednext = False def tryperform(): if self.isComplete(): self.wizard().next() actionEnter = QAction('alt-enter', self) actionEnter.setShortcuts([Qt.CTRL+Qt.Key_Return, Qt.CTRL+Qt.Key_Enter]) actionEnter.triggered.connect(tryperform) self.addAction(actionEnter) self.skiplast = QCheckBox(_('Skip final confirmation page, ' 'close after commit.')) checked = QSettings().value('merge/skiplast', False).toBool() self.skiplast.setChecked(checked) self.layout().addWidget(self.skiplast)
def __init__(self, repoagent, backoutrev, parentbackout, parent): super(SummaryPage, self).__init__(repoagent, parent) self._wctxcleaner = wctxcleaner.WctxCleaner(repoagent, self) self._wctxcleaner.checkStarted.connect(self._onCheckStarted) self._wctxcleaner.checkFinished.connect(self._onCheckFinished) self.setTitle(_('Prepare to backout')) self.setSubTitle(_('Verify backout revision and ensure your working ' 'directory is clean.')) self.setLayout(QVBoxLayout()) self.groups = qtlib.WidgetGroups() repo = self.repo bctx = repo[backoutrev] pctx = repo['.'] if parentbackout: lbl = _('Backing out a parent revision is a single step operation') self.layout().addWidget(QLabel(u'<b>%s</b>' % lbl)) ## backout revision style = csinfo.panelstyle(contents=csinfo.PANEL_DEFAULT) create = csinfo.factory(repo, None, style, withupdate=True) sep = qtlib.LabeledSeparator(_('Backout revision')) self.layout().addWidget(sep) backoutCsInfo = create(bctx.rev()) self.layout().addWidget(backoutCsInfo) ## current revision contents = ('ishead',) + csinfo.PANEL_DEFAULT style = csinfo.panelstyle(contents=contents) def markup_func(widget, item, value): if item == 'ishead' and value is False: text = _('Not a head, backout will create a new head!') return qtlib.markup(text, fg='red', weight='bold') raise csinfo.UnknownItem(item) custom = csinfo.custom(markup=markup_func) create = csinfo.factory(repo, custom, style, withupdate=True) sep = qtlib.LabeledSeparator(_('Current local revision')) self.layout().addWidget(sep) localCsInfo = create(pctx.rev()) self.layout().addWidget(localCsInfo) self.localCsInfo = localCsInfo ## working directory status sep = qtlib.LabeledSeparator(_('Working directory status')) self.layout().addWidget(sep) wdbox = QHBoxLayout() self.layout().addLayout(wdbox) self.wd_status = qtlib.StatusLabel() self.wd_status.set_status(_('Checking...')) wdbox.addWidget(self.wd_status) wd_prog = QProgressBar() wd_prog.setMaximum(0) wd_prog.setTextVisible(False) self.groups.add(wd_prog, 'prog') wdbox.addWidget(wd_prog, 1) text = _('Before backout, you must <a href="commit"><b>commit</b></a>, ' '<a href="shelve"><b>shelve</b></a> to patch, ' 'or <a href="discard"><b>discard</b></a> changes.') wd_text = QLabel(text) wd_text.setWordWrap(True) wd_text.linkActivated.connect(self._wctxcleaner.runCleaner) self.wd_text = wd_text self.groups.add(wd_text, 'dirty') self.layout().addWidget(wd_text) ## auto-resolve autoresolve_chk = QCheckBox(_('Automatically resolve merge conflicts ' 'where possible')) self.registerField('autoresolve', autoresolve_chk) self.layout().addWidget(autoresolve_chk) self.groups.set_visible(False, 'dirty')