def __init__(self, repoagent, rev=None, parent=None, opts={}): super(UpdateDialog, self).__init__(parent) self.setWindowFlags(self.windowFlags() & \ ~Qt.WindowContextHelpButtonHint) self._repoagent = repoagent repo = repoagent.rawRepo() # base layout box box = QVBoxLayout() box.setSpacing(6) ## main layout grid self.grid = QGridLayout() self.grid.setSpacing(6) box.addLayout(self.grid) ### target revision combo self.rev_combo = combo = QComboBox() combo.setEditable(True) self.grid.addWidget(QLabel(_('Update to:')), 0, 0) self.grid.addWidget(combo, 0, 1) # Give the combo box a minimum width that will ensure that the dialog is # large enough to fit the additional progress bar that will appear when # updating subrepositories. combo.setMinimumWidth(450) # always include integer revision try: assert not isinstance(rev, (unicode, QString)) ctx = self.repo[rev] if isinstance(ctx.rev(), int): # could be None or patch name combo.addItem(str(ctx.rev())) except error.RepoLookupError: pass for name in repo.namedbranches: combo.addItem(hglib.tounicode(name)) tags = list(self.repo.tags()) + repo._bookmarks.keys() tags.sort(reverse=True) for tag in tags: combo.addItem(hglib.tounicode(tag)) if rev is None: selecturev = hglib.tounicode(self.repo.dirstate.branch()) else: selecturev = hglib.tounicode(str(rev)) selectindex = combo.findText(selecturev) if selectindex >= 0: combo.setCurrentIndex(selectindex) else: combo.setEditText(selecturev) ### target revision info items = ('%(rev)s', ' %(branch)s', ' %(tags)s', '<br />%(summary)s') style = csinfo.labelstyle(contents=items, width=350, selectable=True) factory = csinfo.factory(self.repo, style=style) self.target_info = factory() self.grid.addWidget(QLabel(_('Target:')), 1, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.target_info, 1, 1) ### parent revision info self.ctxs = self.repo[None].parents() if len(self.ctxs) == 2: self.p1_info = factory() self.grid.addWidget(QLabel(_('Parent 1:')), 2, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.p1_info, 2, 1) self.p2_info = factory() self.grid.addWidget(QLabel(_('Parent 2:')), 3, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.p2_info, 3, 1) else: self.p1_info = factory() self.grid.addWidget(QLabel(_('Parent:')), 2, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addWidget(self.p1_info, 2, 1) ### options self.optbox = QVBoxLayout() self.optbox.setSpacing(6) expander = qtlib.ExpanderLabel(_('Options:'), False) expander.expanded.connect(self.show_options) row = self.grid.rowCount() self.grid.addWidget(expander, row, 0, Qt.AlignLeft | Qt.AlignTop) self.grid.addLayout(self.optbox, row, 1) self.verbose_chk = QCheckBox(_('List updated files (--verbose)')) self.discard_chk = QCheckBox( _('Discard local changes, no backup ' '(-C/--clean)')) self.merge_chk = QCheckBox(_('Always merge (when possible)')) self.autoresolve_chk = QCheckBox( _('Automatically resolve merge conflicts ' 'where possible')) self.showlog_chk = QCheckBox(_('Always show command log')) self.optbox.addWidget(self.verbose_chk) self.optbox.addWidget(self.discard_chk) self.optbox.addWidget(self.merge_chk) self.optbox.addWidget(self.autoresolve_chk) self.optbox.addWidget(self.showlog_chk) s = QSettings() self.discard_chk.setChecked(bool(opts.get('clean'))) #### Persisted Options self.merge_chk.setChecked(QSettings().value('update/merge', False).toBool()) self.autoresolve_chk.setChecked( repo.ui.configbool('tortoisehg', 'autoresolve', False) or s.value('update/autoresolve', False).toBool()) self.showlog_chk.setChecked(s.value('update/showlog', False).toBool()) self.verbose_chk.setChecked(s.value('update/verbose', False).toBool()) ## command widget self.cmd = cmdui.Widget(True, True, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandCanceling.connect(self.command_canceling) self.cmd.output.connect(self.output) self.cmd.makeLogVisible.connect(self.makeLogVisible) self.cmd.progress.connect(self.progress) box.addWidget(self.cmd) ## bottom buttons buttons = QDialogButtonBox() self.cancel_btn = buttons.addButton(QDialogButtonBox.Cancel) self.cancel_btn.clicked.connect(self.cancel_clicked) self.close_btn = buttons.addButton(QDialogButtonBox.Close) self.close_btn.clicked.connect(self.reject) self.close_btn.setAutoDefault(False) self.update_btn = buttons.addButton(_('&Update'), QDialogButtonBox.ActionRole) self.update_btn.clicked.connect(self.update) self.detail_btn = buttons.addButton(_('Detail'), QDialogButtonBox.ResetRole) self.detail_btn.setAutoDefault(False) self.detail_btn.setCheckable(True) self.detail_btn.toggled.connect(self.detail_toggled) box.addWidget(buttons) # signal handlers self.rev_combo.editTextChanged.connect(self.update_info) self.discard_chk.toggled.connect(self.update_info) # dialog setting self.setLayout(box) self.layout().setSizeConstraint(QLayout.SetFixedSize) self.setWindowTitle(_('Update - %s') % self.repo.displayname) self.setWindowIcon(qtlib.geticon('hg-update')) # prepare to show self.cmd.setHidden(True) self.cancel_btn.setHidden(True) self.detail_btn.setHidden(True) self.merge_chk.setHidden(True) self.autoresolve_chk.setHidden(True) self.showlog_chk.setHidden(True) self.update_info() if not self.update_btn.isEnabled(): self.rev_combo.lineEdit().selectAll() # need to change rev # expand options if a hidden one is checked hiddenOptionsChecked = self.hiddenSettingIsChecked() self.show_options(hiddenOptionsChecked) expander.set_expanded(hiddenOptionsChecked)
def __init__(self, repoagent, parent=None): super(ResolveDialog, self).__init__(parent) self._repoagent = repoagent repo = repoagent.rawRepo() self.setWindowFlags(Qt.Window) self.setWindowTitle(_('Resolve Conflicts - %s') % repo.displayname) self.setWindowIcon(qtlib.geticon('hg-merge')) self.setLayout(QVBoxLayout()) self.layout().setSpacing(5) hbox = QHBoxLayout() self.layout().addLayout(hbox) self.refreshButton = tb = QToolButton(self) tb.setIcon(qtlib.geticon('view-refresh')) tb.setShortcut(QKeySequence.Refresh) tb.clicked.connect(self.refresh) self.stlabel = QLabel() hbox.addWidget(tb) hbox.addWidget(self.stlabel) def revisionInfoLayout(repo): """ Return a layout containg the revision information (local and other) """ hbox = QHBoxLayout() hbox.setSpacing(0) hbox.setContentsMargins(*MARGINS) vbox = QVBoxLayout() vbox.setContentsMargins(*MARGINS) hbox.addLayout(vbox) localrevtitle = qtlib.LabeledSeparator(_('Local revision information')) localrevinfo = csinfo.create(repo) localrevinfo.update(repo[None].p1()) vbox.addWidget(localrevtitle) vbox.addWidget(localrevinfo) vbox.addStretch() vbox = QVBoxLayout() vbox.setContentsMargins(*MARGINS) hbox.addLayout(vbox) otherrevtitle = qtlib.LabeledSeparator(_('Other revision information')) otherrevinfo = csinfo.create(repo) otherrevinfo.update(repo[None].p2()) vbox.addWidget(otherrevtitle) vbox.addWidget(otherrevinfo) vbox.addStretch() return hbox if len(self.repo[None].parents()) > 1: self.layout().addLayout(revisionInfoLayout(self.repo)) unres = qtlib.LabeledSeparator(_('Unresolved conflicts')) self.layout().addWidget(unres) hbox = QHBoxLayout() hbox.setSpacing(0) hbox.setContentsMargins(*MARGINS) self.layout().addLayout(hbox) self.utree = PathsTree(self.repo, self) hbox.addWidget(self.utree) vbox = QVBoxLayout() vbox.setContentsMargins(*MARGINS) hbox.addLayout(vbox) auto = QPushButton(_('Mercurial Re&solve')) auto.setToolTip(_('Attempt automatic (trivial) merge')) auto.clicked.connect(lambda: self.merge('internal:merge')) manual = QPushButton(_('Tool &Resolve')) manual.setToolTip(_('Merge using selected merge tool')) manual.clicked.connect(self.merge) local = QPushButton(_('&Take Local')) local.setToolTip(_('Accept the local file version (yours)')) local.clicked.connect(lambda: self.merge('internal:local')) other = QPushButton(_('Take &Other')) other.setToolTip(_('Accept the other file version (theirs)')) other.clicked.connect(lambda: self.merge('internal:other')) res = QPushButton(_('&Mark as Resolved')) res.setToolTip(_('Mark this file as resolved')) res.clicked.connect(self.markresolved) vbox.addWidget(auto) vbox.addWidget(manual) vbox.addWidget(local) vbox.addWidget(other) vbox.addWidget(res) vbox.addStretch(1) self.ubuttons = (auto, manual, local, other, res) self.utree.setContextMenuPolicy(Qt.CustomContextMenu) self.utreecmenu = QMenu(self) cmauto = self.utreecmenu.addAction(_('Mercurial Re&solve')) cmauto.triggered.connect(lambda: self.merge('internal:merge')) cmmanual = self.utreecmenu.addAction(_('Tool &Resolve')) cmmanual.triggered.connect(self.merge) cmlocal = self.utreecmenu.addAction(_('&Take Local')) cmlocal.triggered.connect(lambda: self.merge('internal:local')) cmother = self.utreecmenu.addAction(_('Take &Other')) cmother.triggered.connect(lambda: self.merge('internal:other')) cmres = self.utreecmenu.addAction(_('&Mark as Resolved')) cmres.triggered.connect(self.markresolved) self.utreecmenu.addSeparator() cmdiffLocToAnc = self.utreecmenu.addAction(_('Diff &Local to Ancestor')) cmdiffLocToAnc.triggered.connect(self.diffLocToAnc) cmdiffOthToAnc = self.utreecmenu.addAction(_('&Diff Other to Ancestor')) cmdiffOthToAnc.triggered.connect(self.diffOthToAnc) self.umenuitems = (cmauto, cmmanual, cmlocal, cmother, cmres, cmdiffLocToAnc, cmdiffOthToAnc) self.utree.customContextMenuRequested.connect(self.utreeMenuRequested) self.utree.doubleClicked.connect(self.utreeDoubleClicked) res = qtlib.LabeledSeparator(_('Resolved conflicts')) self.layout().addWidget(res) hbox = QHBoxLayout() hbox.setContentsMargins(*MARGINS) hbox.setSpacing(0) self.layout().addLayout(hbox) self.rtree = PathsTree(self.repo, self) hbox.addWidget(self.rtree) vbox = QVBoxLayout() vbox.setContentsMargins(*MARGINS) hbox.addLayout(vbox) edit = QPushButton(_('&Edit File')) edit.setToolTip(_('Edit resolved file')) edit.clicked.connect(self.edit) v3way = QPushButton(_('3-&Way Diff')) v3way.setToolTip(_('Visual three-way diff')) v3way.clicked.connect(self.v3way) vp0 = QPushButton(_('Diff to &Local')) vp0.setToolTip(_('Visual diff between resolved file and first parent')) vp0.clicked.connect(self.vp0) vp1 = QPushButton(_('&Diff to Other')) vp1.setToolTip(_('Visual diff between resolved file and second parent')) vp1.clicked.connect(self.vp1) ures = QPushButton(_('Mark as &Unresolved')) ures.setToolTip(_('Mark this file as unresolved')) ures.clicked.connect(self.markunresolved) vbox.addWidget(edit) vbox.addWidget(v3way) vbox.addWidget(vp0) vbox.addWidget(vp1) vbox.addWidget(ures) vbox.addStretch(1) self.rbuttons = (edit, vp0, ures) self.rmbuttons = (vp1, v3way) self.rtree.setContextMenuPolicy(Qt.CustomContextMenu) self.rtreecmenu = QMenu(self) cmedit = self.rtreecmenu.addAction(_('&Edit File')) cmedit.triggered.connect(self.edit) cmv3way = self.rtreecmenu.addAction(_('3-&Way Diff')) cmv3way.triggered.connect(self.v3way) cmvp0 = self.rtreecmenu.addAction(_('Diff to &Local')) cmvp0.triggered.connect(self.vp0) cmvp1 = self.rtreecmenu.addAction(_('&Diff to Other')) cmvp1.triggered.connect(self.vp1) cmures = self.rtreecmenu.addAction(_('Mark as &Unresolved')) cmures.triggered.connect(self.markunresolved) self.rmenuitems = (cmedit, cmvp0, cmures) self.rmmenuitems = (cmvp1, cmv3way) self.rtree.customContextMenuRequested.connect(self.rtreeMenuRequested) self.rtree.doubleClicked.connect(self.vp0) hbox = QHBoxLayout() hbox.setContentsMargins(*MARGINS) hbox.setSpacing(4) self.layout().addLayout(hbox) self.tcombo = ToolsCombo(self.repo, self) hbox.addWidget(QLabel(_('Detected merge/diff tools:'))) hbox.addWidget(self.tcombo) hbox.addStretch(1) out = qtlib.LabeledSeparator(_('Command output')) self.layout().addWidget(out) self.cmd = cmdui.Widget(True, False, self) self.cmd.commandFinished.connect(self.refresh) self.cmd.setShowOutput(True) self.layout().addWidget(self.cmd) BB = QDialogButtonBox bbox = QDialogButtonBox(BB.Close) bbox.rejected.connect(self.reject) self.layout().addWidget(bbox) self.bbox = bbox s = QSettings() self.restoreGeometry(s.value('resolve/geom').toByteArray()) self.refresh() self.utree.selectAll() self.utree.setFocus() repoagent.configChanged.connect(self.configChanged) repoagent.repositoryChanged.connect(self.repositoryChanged)
def __init__(self, repoagent, rev=None, parent=None, opts={}): super(StripDialog, self).__init__(parent) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self.setWindowIcon(qtlib.geticon('menudelete')) self._repoagent = repoagent # base layout box box = QVBoxLayout() box.setSpacing(6) ## main layout grid self.grid = grid = QGridLayout() grid.setSpacing(6) box.addLayout(grid) ### target revision combo self.rev_combo = combo = QComboBox() combo.setEditable(True) grid.addWidget(QLabel(_('Strip:')), 0, 0) grid.addWidget(combo, 0, 1) grid.addWidget(QLabel(_('Preview:')), 1, 0, Qt.AlignLeft | Qt.AlignTop) self.status = QLabel("") grid.addWidget(self.status, 1, 1, Qt.AlignLeft | Qt.AlignTop) if rev is None: rev = self.repo.dirstate.branch() else: rev = str(rev) combo.addItem(hglib.tounicode(rev)) combo.setCurrentIndex(0) for name in self.repo.namedbranches: combo.addItem(name) tags = list(self.repo.tags()) tags.sort(reverse=True) for tag in tags: combo.addItem(hglib.tounicode(tag)) ### preview box, contained in scroll area, contains preview grid self.cslist = cslist.ChangesetList(self.repo) cslistrow = 2 cslistcol = 1 grid.addWidget(self.cslist, cslistrow, cslistcol) ### options optbox = QVBoxLayout() optbox.setSpacing(6) expander = qtlib.ExpanderLabel(_('Options:'), False) expander.expanded.connect(self.show_options) grid.addWidget(expander, 3, 0, Qt.AlignLeft | Qt.AlignTop) grid.addLayout(optbox, 3, 1) self.discard_chk = QCheckBox( _('Discard local changes, no backup ' '(-f/--force)')) self.nobackup_chk = QCheckBox(_('No backup (-n/--nobackup)')) optbox.addWidget(self.discard_chk) optbox.addWidget(self.nobackup_chk) self.discard_chk.setChecked(bool(opts.get('force'))) self.nobackup_chk.setChecked(bool(opts.get('nobackup'))) ## command widget self.cmd = cmdui.Widget(True, True, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandCanceling.connect(self.command_canceling) box.addWidget(self.cmd) ## bottom buttons buttons = QDialogButtonBox() self.cancel_btn = buttons.addButton(QDialogButtonBox.Cancel) self.cancel_btn.clicked.connect(self.cancel_clicked) self.close_btn = buttons.addButton(QDialogButtonBox.Close) self.close_btn.clicked.connect(self.reject) self.close_btn.setAutoDefault(False) self.strip_btn = buttons.addButton(_('&Strip'), QDialogButtonBox.ActionRole) self.strip_btn.clicked.connect(self.strip) self.detail_btn = buttons.addButton(_('Detail'), QDialogButtonBox.ResetRole) self.detail_btn.setAutoDefault(False) self.detail_btn.setCheckable(True) self.detail_btn.toggled.connect(self.detail_toggled) grid.setRowStretch(cslistrow, 1) grid.setColumnStretch(cslistcol, 1) box.addWidget(buttons) # signal handlers self.rev_combo.editTextChanged.connect(lambda *a: self.preview()) self.rev_combo.lineEdit().returnPressed.connect(self.strip) self.discard_chk.toggled.connect(lambda *a: self.preview()) # dialog setting self.setLayout(box) self.layout().setSizeConstraint(QLayout.SetMinAndMaxSize) self.setWindowTitle(_('Strip - %s') % self.repo.displayname) #self.setWindowIcon(qtlib.geticon('strip')) # prepare to show self.rev_combo.lineEdit().selectAll() self.cslist.setHidden(False) self.cmd.setHidden(True) self.cancel_btn.setHidden(True) self.detail_btn.setHidden(True) self.nobackup_chk.setHidden(True) self.preview()
def __init__(self, args=None, opts={}, parent=None): super(CloneDialog, self).__init__(parent) f = self.windowFlags() self.setWindowFlags(f & ~Qt.WindowContextHelpButtonHint) self.ui = ui.ui() self.ret = None dest = src = cwd = os.getcwd() if len(args) > 1: src = args[0] dest = args[1] elif len(args): src = args[0] udest = hglib.tounicode(dest) usrc = hglib.tounicode(src) ucwd = hglib.tounicode(cwd) self.prev_dest = None # base layout box box = QVBoxLayout() box.setSpacing(6) ## main layout grid grid = QGridLayout() grid.setSpacing(6) box.addLayout(grid) ### source combo and button self.src_combo = QComboBox() self.src_combo.setEditable(True) self.src_combo.setMinimumWidth(310) self.src_btn = QPushButton(_('Browse...')) self.src_btn.setAutoDefault(False) self.src_btn.clicked.connect(self.browse_src) grid.addWidget(QLabel(_('Source:')), 0, 0) grid.addWidget(self.src_combo, 0, 1) grid.addWidget(self.src_btn, 0, 2) ### destination combo and button self.dest_combo = QComboBox() self.dest_combo.setEditable(True) self.dest_combo.setMinimumWidth(310) self.dest_btn = QPushButton(_('Browse...')) self.dest_btn.setAutoDefault(False) self.dest_btn.clicked.connect(self.browse_dest) grid.addWidget(QLabel(_('Destination:')), 1, 0) grid.addWidget(self.dest_combo, 1, 1) grid.addWidget(self.dest_btn, 1, 2) # workaround for QComboBox to test edited text case-sensitively # see src/gui/widgets/qcombobox.cpp: # QComboBoxPrivate::_q_editingFinished() and matchFlags() for name in ('src_combo', 'dest_combo'): w = getattr(self, name).lineEdit() w.completer().setCaseSensitivity(Qt.CaseSensitive) s = QSettings() self.shist = s.value('clone/source').toStringList() for path in self.shist: if path: self.src_combo.addItem(path) self.src_combo.setEditText(usrc) self.dhist = s.value('clone/dest').toStringList() for path in self.dhist: if path: self.dest_combo.addItem(path) self.dest_combo.setEditText(udest) ### options expander = qtlib.ExpanderLabel(_('Options'), False) expander.expanded.connect(self.show_options) grid.addWidget(expander, 2, 0, Qt.AlignLeft | Qt.AlignTop) optbox = QVBoxLayout() optbox.setSpacing(6) grid.addLayout(optbox, 2, 1, 1, 2) def chktext(chklabel, btnlabel=None, btnslot=None, stretch=None): hbox = QHBoxLayout() hbox.setSpacing(0) optbox.addLayout(hbox) chk = QCheckBox(chklabel) text = QLineEdit(enabled=False) hbox.addWidget(chk) hbox.addWidget(text) if stretch is not None: hbox.addStretch(stretch) if btnlabel: btn = QPushButton(btnlabel) btn.setEnabled(False) btn.setAutoDefault(False) btn.clicked.connect(btnslot) hbox.addSpacing(6) hbox.addWidget(btn) chk.toggled.connect( lambda e: self.toggle_enabled(e, text, target2=btn)) return chk, text, btn else: chk.toggled.connect(lambda e: self.toggle_enabled(e, text)) return chk, text self.rev_chk, self.rev_text = chktext(_('Clone to revision:'), stretch=40) self.noupdate_chk = QCheckBox( _('Do not update the new working directory')) self.pproto_chk = QCheckBox(_('Use pull protocol to copy metadata')) self.uncomp_chk = QCheckBox(_('Use uncompressed transfer')) optbox.addWidget(self.noupdate_chk) optbox.addWidget(self.pproto_chk) optbox.addWidget(self.uncomp_chk) self.qclone_chk, self.qclone_txt, self.qclone_btn = \ chktext(_('Include patch queue'), btnlabel=_('Browse...'), btnslot=self.onBrowseQclone) self.proxy_chk = QCheckBox(_('Use proxy server')) optbox.addWidget(self.proxy_chk) useproxy = bool(self.ui.config('http_proxy', 'host')) self.proxy_chk.setEnabled(useproxy) self.proxy_chk.setChecked(useproxy) self.insecure_chk = QCheckBox(_('Do not verify host certificate')) optbox.addWidget(self.insecure_chk) self.insecure_chk.setEnabled(False) self.remote_chk, self.remote_text = chktext(_('Remote command:')) # allow to specify start revision for p4 & svn repos. self.startrev_chk, self.startrev_text = chktext(_('Start revision:'), stretch=40) self.hmcmd_lbl = QLabel(_('Hg command:')) self.hmcmd_lbl.setAlignment(Qt.AlignRight) self.hmcmd_txt = QLineEdit() self.hmcmd_txt.setReadOnly(True) grid.addWidget(self.hmcmd_lbl, 3, 0) grid.addWidget(self.hmcmd_txt, 3, 1) self.hmcmd_txt.setMinimumWidth(400) ## command widget self.cmd = cmdui.Widget(True, True, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandFinished.connect(self.cmdfinished) self.cmd.commandCanceling.connect(self.command_canceling) box.addWidget(self.cmd) ## bottom buttons buttons = QDialogButtonBox() self.cancel_btn = buttons.addButton(QDialogButtonBox.Cancel) self.cancel_btn.clicked.connect(self.cmd.cancel) self.close_btn = buttons.addButton(QDialogButtonBox.Close) self.close_btn.clicked.connect(self.onCloseClicked) self.close_btn.setAutoDefault(False) self.clone_btn = buttons.addButton(_('&Clone'), QDialogButtonBox.ActionRole) self.clone_btn.clicked.connect(self.clone) self.detail_btn = buttons.addButton(_('Detail'), QDialogButtonBox.ResetRole) self.detail_btn.setAutoDefault(False) self.detail_btn.setCheckable(True) self.detail_btn.toggled.connect(self.detail_toggled) box.addWidget(buttons) # dialog setting self.setLayout(box) self.layout().setSizeConstraint(QLayout.SetFixedSize) self.setWindowTitle(_('Clone - %s') % ucwd) self.setWindowIcon(qtlib.geticon('hg-clone')) # connect extra signals self.src_combo.editTextChanged.connect(self.composeCommand) self.src_combo.editTextChanged.connect(self.onUrlHttps) self.src_combo.editTextChanged.connect(self.onResetDefault) self.src_combo.currentIndexChanged.connect(self.onResetDefault) self.dest_combo.editTextChanged.connect(self.composeCommand) self.rev_chk.toggled.connect(self.composeCommand) self.rev_text.textChanged.connect(self.composeCommand) self.noupdate_chk.toggled.connect(self.composeCommand) self.pproto_chk.toggled.connect(self.composeCommand) self.uncomp_chk.toggled.connect(self.composeCommand) self.qclone_chk.toggled.connect(self.composeCommand) self.qclone_txt.textChanged.connect(self.composeCommand) self.proxy_chk.toggled.connect(self.composeCommand) self.insecure_chk.toggled.connect(self.composeCommand) self.remote_chk.toggled.connect(self.composeCommand) self.remote_text.textChanged.connect(self.composeCommand) self.startrev_chk.toggled.connect(self.composeCommand) # prepare to show self.cmd.setHidden(True) self.cancel_btn.setHidden(True) self.detail_btn.setHidden(True) self.show_options(False) rev = opts.get('rev') if rev: self.rev_chk.setChecked(True) self.rev_text.setText(hglib.tounicode(', '.join(rev))) self.noupdate_chk.setChecked(bool(opts.get('noupdate'))) self.pproto_chk.setChecked(bool(opts.get('pull'))) self.uncomp_chk.setChecked(bool(opts.get('uncompressed'))) self.src_combo.setFocus() self.src_combo.lineEdit().selectAll() self.composeCommand()
def __init__(self, repo, opts, parent=None): super(BisectDialog, self).__init__(parent) self.setWindowTitle(_('Bisect - %s') % repo.displayname) self.setWindowIcon(qtlib.geticon('hg-bisect')) self.setWindowFlags(Qt.Window) self.repo = repo # base layout box box = QVBoxLayout() box.setSpacing(6) self.setLayout(box) hbox = QHBoxLayout() hbox.addWidget(QLabel(_('Known good revision:'))) gle = QLineEdit() gle.setText(opts.get('good', '')) hbox.addWidget(gle, 1) gb = QPushButton(_('Accept')) hbox.addWidget(gb) box.addLayout(hbox) hbox = QHBoxLayout() hbox.addWidget(QLabel(_('Known bad revision:'))) ble = QLineEdit() ble.setText(opts.get('bad', '')) ble.setEnabled(False) hbox.addWidget(ble, 1) bb = QPushButton(_('Accept')) bb.setEnabled(False) hbox.addWidget(bb) box.addLayout(hbox) ## command widget self.cmd = cmdui.Widget(True, False, self) self.cmd.setShowOutput(True) box.addWidget(self.cmd, 1) hbox = QHBoxLayout() goodrev = QPushButton(_('Revision is Good')) hbox.addWidget(goodrev) badrev = QPushButton(_('Revision is Bad')) hbox.addWidget(badrev) skiprev = QPushButton(_('Skip this Revision')) hbox.addWidget(skiprev) box.addLayout(hbox) hbox = QHBoxLayout() box.addLayout(hbox) lbl = QLabel() hbox.addWidget(lbl) hbox.addStretch(1) closeb = QPushButton(_('Close')) hbox.addWidget(closeb) closeb.clicked.connect(self.reject) self.nextbuttons = (goodrev, badrev, skiprev) for b in self.nextbuttons: b.setEnabled(False) self.lastrev = None def cmdFinished(ret): if ret != 0: lbl.setText(_('Error encountered.')) return repo.dirstate.invalidate() ctx = repo['.'] if ctx.rev() == self.lastrev: lbl.setText(_('Culprit found.')) return self.lastrev = ctx.rev() for b in self.nextbuttons: b.setEnabled(True) lbl.setText('%s: %d (%s) -> %s' % (_('Revision'), ctx.rev(), ctx, _('Test this revision and report findings. ' '(good/bad/skip)'))) self.cmd.commandFinished.connect(cmdFinished) prefix = ['bisect', '--repository', repo.root] def gverify(): good = hglib.fromunicode(gle.text().simplified()) try: ctx = repo[good] self.goodrev = ctx.rev() gb.setEnabled(False) gle.setEnabled(False) bb.setEnabled(True) ble.setEnabled(True) ble.setFocus() except error.RepoLookupError, e: self.cmd.core.stbar.showMessage(hglib.tounicode(str(e))) except util.Abort, e: if e.hint: err = _('%s (hint: %s)') % (hglib.tounicode( str(e)), hglib.tounicode(e.hint)) else: err = hglib.tounicode(str(e)) self.cmd.core.stbar.showMessage(err)
def __init__(self, repo, parent, **opts): super(RebaseDialog, self).__init__(parent) self.setWindowIcon(qtlib.geticon('hg-rebase')) f = self.windowFlags() self.setWindowFlags(f & ~Qt.WindowContextHelpButtonHint) self.repo = repo self.opts = opts self.aborted = False box = QVBoxLayout() box.setSpacing(8) box.setContentsMargins(*(6,)*4) self.setLayout(box) style = csinfo.panelstyle(selectable=True) srcb = QGroupBox( _('Rebase changeset and descendants')) srcb.setLayout(QVBoxLayout()) srcb.layout().setContentsMargins(*(2,)*4) s = opts.get('source', '.') source = csinfo.create(self.repo, s, style, withupdate=True) srcb.layout().addWidget(source) self.layout().addWidget(srcb) destb = QGroupBox( _('To rebase destination')) destb.setLayout(QVBoxLayout()) destb.layout().setContentsMargins(*(2,)*4) d = opts.get('dest', '.') dest = csinfo.create(self.repo, d, style, withupdate=True) destb.layout().addWidget(dest) self.destcsinfo = dest self.layout().addWidget(destb) sep = qtlib.LabeledSeparator(_('Options')) self.layout().addWidget(sep) self.keepchk = QCheckBox(_('Keep original changesets')) self.keepchk.setChecked(opts.get('keep', False)) self.layout().addWidget(self.keepchk) self.keepbrancheschk = QCheckBox(_('Keep original branch names')) self.keepbrancheschk.setChecked(opts.get('keepbranches', False)) self.layout().addWidget(self.keepbrancheschk) self.detachchk = QCheckBox(_('Force detach of rebased changesets ' 'from their original branch')) self.detachchk.setChecked(opts.get('detach', True)) self.layout().addWidget(self.detachchk) self.collapsechk = QCheckBox(_('Collapse the rebased changesets ')) self.collapsechk.setChecked(opts.get('collapse', False)) self.layout().addWidget(self.collapsechk) self.autoresolvechk = QCheckBox(_('Automatically resolve merge conflicts ' 'where possible')) self.autoresolvechk.setChecked( repo.ui.configbool('tortoisehg', 'autoresolve', False)) self.layout().addWidget(self.autoresolvechk) if 'hgsubversion' in repo.extensions(): self.svnchk = QCheckBox(_('Rebase unpublished onto Subversion head ' '(override source, destination)')) self.layout().addWidget(self.svnchk) else: self.svnchk = None self.cmd = cmdui.Widget(True, True, self) self.cmd.commandFinished.connect(self.commandFinished) self.showMessage.connect(self.cmd.stbar.showMessage) self.cmd.stbar.linkActivated.connect(self.linkActivated) self.layout().addWidget(self.cmd, 2) bbox = QDialogButtonBox() self.cancelbtn = bbox.addButton(QDialogButtonBox.Cancel) self.cancelbtn.clicked.connect(self.reject) self.rebasebtn = bbox.addButton(_('Rebase'), QDialogButtonBox.ActionRole) self.rebasebtn.clicked.connect(self.rebase) self.abortbtn = bbox.addButton(_('Abort'), QDialogButtonBox.ActionRole) self.abortbtn.clicked.connect(self.abort) self.layout().addWidget(bbox) self.bbox = bbox if self.checkResolve() or not (s or d): for w in (srcb, destb, sep, self.keepchk, self.detachchk, self.collapsechk, self.keepbrancheschk): w.setHidden(True) self.cmd.setShowOutput(True) else: self.showMessage.emit(_('Checking...')) self.abortbtn.setEnabled(False) self.rebasebtn.setEnabled(False) QTimer.singleShot(0, self.checkStatus) self.setMinimumWidth(480) self.setMaximumHeight(800) self.resize(0, 340) self.setWindowTitle(_('Rebase - %s') % self.repo.displayname)
def init_view(self, src, dest): """define the view""" # widgets self.src_lbl = QLabel(_('Source:')) self.src_lbl.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.src_txt = QLineEdit(src) self.src_txt.setMinimumWidth(300) self.src_btn = QPushButton(_('Browse...')) self.dest_lbl = QLabel(_('Destination:')) self.dest_lbl.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.dest_txt = QLineEdit(dest) self.dest_btn = QPushButton(_('Browse...')) self.copy_chk = QCheckBox(_('Copy source -> destination')) comp = manifestmodel.ManifestCompleter(self) comp.setModel(manifestmodel.ManifestModel(self.repo, parent=comp)) self.src_txt.setCompleter(comp) self.dest_txt.setCompleter(comp) # some extras self.dummy_lbl = QLabel('') self.hmcmd_lbl = QLabel(_('Hg command:')) self.hmcmd_lbl.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.hmcmd_txt = QLineEdit() self.hmcmd_txt.setReadOnly(True) self.show_command(self.compose_command(self.get_src(), self.get_dest())) self.keep_open_chk = QCheckBox(_('Always show output')) # command widget self.cmd = cmdui.Widget(True, False, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandCanceling.connect(self.command_canceling) self.cmd.output.connect(self.output) self.cmd.makeLogVisible.connect(self.makeLogVisible) self.cmd.progress.connect(self.progress) self.cmd.setHidden(True) # bottom buttons self.rename_btn = QPushButton('') self.rename_btn.setDefault(True) self.rename_btn.setFocus(True) self.close_btn = QPushButton(_('&Close')) self.close_btn.setAutoDefault(False) self.detail_btn = QPushButton(_('&Detail')) self.detail_btn.setAutoDefault(False) self.detail_btn.setHidden(True) self.cancel_btn = QPushButton(_('Cancel')) self.cancel_btn.setAutoDefault(False) self.cancel_btn.setHidden(True) # connecting slots self.src_txt.textChanged.connect(self.src_dest_edited) self.src_btn.clicked.connect(self.src_btn_clicked) self.dest_txt.textChanged.connect(self.src_dest_edited) self.dest_btn.clicked.connect(self.dest_btn_clicked) self.copy_chk.toggled.connect(self.copy_chk_toggled) self.rename_btn.clicked.connect(self.rename) self.detail_btn.clicked.connect(self.detail_clicked) self.close_btn.clicked.connect(self.close) self.cancel_btn.clicked.connect(self.cancel_clicked) # main layout self.grid = QGridLayout() self.grid.setSpacing(6) self.grid.addWidget(self.src_lbl, 0, 0) self.grid.addWidget(self.src_txt, 0, 1) self.grid.addWidget(self.src_btn, 0, 2) self.grid.addWidget(self.dest_lbl, 1, 0) self.grid.addWidget(self.dest_txt, 1, 1) self.grid.addWidget(self.dest_btn, 1, 2) self.grid.addWidget(self.copy_chk, 2, 1) self.grid.addWidget(self.dummy_lbl, 3, 1) self.grid.addWidget(self.hmcmd_lbl, 4, 0) self.grid.addWidget(self.hmcmd_txt, 4, 1) self.grid.addWidget(self.keep_open_chk, 5, 1) self.hbox = QHBoxLayout() self.hbox.addWidget(self.detail_btn) self.hbox.addStretch(0) self.hbox.addWidget(self.rename_btn) self.hbox.addWidget(self.close_btn) self.hbox.addWidget(self.cancel_btn) self.vbox = QVBoxLayout() self.vbox.setSpacing(6) self.vbox.addLayout(self.grid) self.vbox.addWidget(self.cmd) self.vbox.addLayout(self.hbox) # dialog setting self.setWindowIcon(qtlib.geticon('hg-rename')) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self.copy_chk.setChecked(self.iscopy) self.setLayout(self.vbox) self.layout().setSizeConstraint(QLayout.SetFixedSize) self.dest_txt.setFocus() self._readsettings() self.setRenameCopy()
def __init__(self, ui, repo, rev=None, parent=None): super(ArchiveDialog, self).__init__(parent) # main layout self.vbox = QVBoxLayout() self.vbox.setSpacing(6) self.grid = QGridLayout() self.grid.setSpacing(6) self.vbox.addLayout(self.grid) # content selection self.rev_lbl = QLabel(_('Revision:')) self.rev_lbl.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.rev_combo = QComboBox() self.rev_combo.setEditable(True) self.rev_combo.setSizeAdjustPolicy(QComboBox.AdjustToContents) self.files_in_rev_chk = QCheckBox( _('Only files modified/created in this revision')) self.subrepos_chk = QCheckBox(_('Recurse into subrepositories')) self.grid.addWidget(self.rev_lbl, 0, 0) self.grid.addWidget(self.rev_combo, 0, 1) self.grid.addWidget(self.files_in_rev_chk, 1, 1) self.grid.addWidget(self.subrepos_chk, 2, 1) # selecting a destination self.dest_lbl = QLabel(_('Destination path:')) self.dest_lbl.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.dest_edit = QLineEdit() self.dest_edit.setMinimumWidth(300) self.dest_btn = QPushButton(_('Browse...')) self.dest_btn.setAutoDefault(False) self.grid.addWidget(self.dest_lbl, 3, 0) self.grid.addWidget(self.dest_edit, 3, 1) self.grid.addWidget(self.dest_btn, 3, 2) # archive type selection self.types_lbl = QLabel(_('Archive types:')) self.types_lbl.setAlignment(Qt.AlignRight|Qt.AlignVCenter) def radio(label): return QRadioButton(label, None) self.filesradio = radio(_('Directory of files')) self.tarradio = radio(_('Uncompressed tar archive')) self.tbz2radio = radio(_('Tar archive compressed using bzip2')) self.tgzradio = radio(_('Tar archive compressed using gzip')) self.uzipradio = radio(_('Uncompressed zip archive')) self.zipradio = radio(_('Zip archive compressed using deflate')) self.grid.addWidget(self.types_lbl, 4, 0) self.grid.addWidget(self.filesradio, 4, 1) self.grid.addWidget(self.tarradio, 5, 1) self.grid.addWidget(self.tbz2radio, 6, 1) self.grid.addWidget(self.tgzradio, 7, 1) self.grid.addWidget(self.uzipradio, 8, 1) self.grid.addWidget(self.zipradio, 9, 1) # some extras self.hmcmd_lbl = QLabel(_('Hg command:')) self.hmcmd_lbl.setAlignment(Qt.AlignRight|Qt.AlignVCenter) self.hmcmd_txt = QLineEdit() self.hmcmd_txt.setReadOnly(True) self.keep_open_chk = QCheckBox(_('Always show output')) self.grid.addWidget(self.hmcmd_lbl, 10, 0) self.grid.addWidget(self.hmcmd_txt, 10, 1) self.grid.addWidget(self.keep_open_chk, 11, 1) # command widget self.cmd = cmdui.Widget(True, True, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandCanceling.connect(self.command_canceling) self.cmd.output.connect(self.output) self.cmd.makeLogVisible.connect(self.makeLogVisible) self.cmd.progress.connect(self.progress) self.cmd.setHidden(True) self.vbox.addWidget(self.cmd) # bottom buttons self.hbox = QHBoxLayout() self.arch_btn = QPushButton(_('&Archive')) self.arch_btn.setDefault(True) self.close_btn = QPushButton(_('&Close')) self.close_btn.setAutoDefault(False) self.close_btn.setFocus() self.detail_btn = QPushButton(_('&Detail')) self.detail_btn.setAutoDefault(False) self.detail_btn.setHidden(True) self.cancel_btn = QPushButton(_('Cancel')) self.cancel_btn.setAutoDefault(False) self.cancel_btn.setHidden(True) self.hbox.addWidget(self.detail_btn) self.hbox.addStretch(0) self.hbox.addWidget(self.arch_btn) self.hbox.addWidget(self.close_btn) self.hbox.addWidget(self.cancel_btn) self.vbox.addLayout(self.hbox) # set default values self.ui = ui self.repo = repo self.initrev = rev self.prevtarget = None self.rev_combo.addItem(WD_PARENT) for b in self.repo.branchtags(): self.rev_combo.addItem(b) tags = list(self.repo.tags()) tags.sort(reverse=True) for t in tags: self.rev_combo.addItem(t) if self.initrev: text = str(self.initrev) if self.rev_combo.findText(text, Qt.MatchFlags(Qt.MatchExactly)) == -1: self.rev_combo.insertItems(0, [text]) self.rev_combo.setMaxVisibleItems(self.rev_combo.count()) self.rev_combo.setCurrentIndex(0) self.subrepos_chk.setChecked(self.get_subrepos_present()) self.dest_edit.setText(hglib.tounicode(self.repo.root)) self.filesradio.setChecked(True) self.update_path() # connecting slots self.dest_edit.textEdited.connect(self.dest_edited) self.connect(self.rev_combo, SIGNAL('currentIndexChanged(int)'), self.rev_combo_changed) self.connect(self.rev_combo, SIGNAL('editTextChanged(QString)'), self.rev_combo_changed) self.dest_btn.clicked.connect(self.browse_clicked) self.files_in_rev_chk.stateChanged.connect(self.dest_edited) self.subrepos_chk.toggled.connect(self.onSubreposToggled) self.filesradio.toggled.connect(self.update_path) self.tarradio.toggled.connect(self.update_path) self.tbz2radio.toggled.connect(self.update_path) self.tgzradio.toggled.connect(self.update_path) self.uzipradio.toggled.connect(self.update_path) self.zipradio.toggled.connect(self.update_path) self.arch_btn.clicked.connect(self.archive) self.detail_btn.clicked.connect(self.detail_clicked) self.close_btn.clicked.connect(self.close) self.cancel_btn.clicked.connect(self.cancel_clicked) # dialog setting self.setWindowTitle(_('Archive - %s') % self.repo.displayname) self.setWindowIcon(qtlib.geticon('hg-archive')) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self.setLayout(self.vbox) self.layout().setSizeConstraint(QLayout.SetFixedSize) self.rev_combo.setFocus() self._readsettings()
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 __init__(self, repoagent, opts, parent=None): super(BisectDialog, self).__init__(parent) self.setWindowTitle(_('Bisect - %s') % repoagent.rawRepo().displayname) self.setWindowIcon(qtlib.geticon('hg-bisect')) self.setWindowFlags(Qt.Window) self._repoagent = repoagent # base layout box box = QVBoxLayout() box.setSpacing(6) self.setLayout(box) hbox = QHBoxLayout() hbox.addWidget(QLabel(_('Known good revision:'))) self._gle = gle = QLineEdit() gle.setText(opts.get('good', '')) hbox.addWidget(gle, 1) self._gb = gb = QPushButton(_('Accept')) hbox.addWidget(gb) box.addLayout(hbox) hbox = QHBoxLayout() hbox.addWidget(QLabel(_('Known bad revision:'))) self._ble = ble = QLineEdit() ble.setText(opts.get('bad', '')) ble.setEnabled(False) hbox.addWidget(ble, 1) self._bb = bb = QPushButton(_('Accept')) bb.setEnabled(False) hbox.addWidget(bb) box.addLayout(hbox) ## command widget self.cmd = cmdui.Widget(True, True, self) self.cmd.setShowOutput(True) box.addWidget(self.cmd, 1) hbox = QHBoxLayout() goodrev = QPushButton(_('Revision is Good')) hbox.addWidget(goodrev) badrev = QPushButton(_('Revision is Bad')) hbox.addWidget(badrev) skiprev = QPushButton(_('Skip this Revision')) hbox.addWidget(skiprev) box.addLayout(hbox) hbox = QHBoxLayout() box.addLayout(hbox) self._lbl = lbl = QLabel() hbox.addWidget(lbl) hbox.addStretch(1) closeb = QPushButton(_('Close')) hbox.addWidget(closeb) closeb.clicked.connect(self.reject) self.nextbuttons = (goodrev, badrev, skiprev) for b in self.nextbuttons: b.setEnabled(False) self.lastrev = None self.cmd.commandFinished.connect(self._cmdFinished) gb.pressed.connect(self._verifyGood) bb.pressed.connect(self._verifyBad) gle.returnPressed.connect(self._verifyGood) ble.returnPressed.connect(self._verifyBad) goodrev.clicked.connect(self._markGoodRevision) badrev.clicked.connect(self._markBadRevision) skiprev.clicked.connect(self._skipRevision)
def __init__(self, repoagent, parent, **opts): super(GraftDialog, self).__init__(parent) self.setWindowIcon(qtlib.geticon('hg-transplant')) f = self.windowFlags() self.setWindowFlags(f & ~Qt.WindowContextHelpButtonHint) self._repoagent = repoagent self._graftstatefile = self.repo.join('graftstate') self.aborted = False self.valid = True def cleanrevlist(revlist): return [self.repo[rev].rev() for rev in revlist] self.sourcelist = cleanrevlist(opts.get('source', ['.'])) currgraftrevs = self.graftstate() if currgraftrevs: currgraftrevs = cleanrevlist(currgraftrevs) if self.sourcelist != currgraftrevs: res = qtlib.CustomPrompt(_('Interrupted graft operation found'), _('An interrupted graft operation has been found.\n\n' 'You cannot perform a different graft operation unless ' 'you abort the interrupted graft operation first.'), self, (_('Continue or abort interrupted graft operation?'), _('Cancel')), 1, 2).run() if res != 0: # Cancel self.valid = False return # Continue creating the dialog, but use the graft source # of the existing, interrupted graft as the source, rather than # the one that was passed as an option to the dialog constructor self.sourcelist = currgraftrevs box = QVBoxLayout() box.setSpacing(8) box.setContentsMargins(*(6,)*4) self.setLayout(box) destrev = self.repo['.'].rev() if len(self.sourcelist) > 1: listlabel = qtlib.LabeledSeparator( _('Graft %d changesets on top of changeset %s') \ % (len(self.sourcelist), destrev)) self.layout().addWidget(listlabel) self.cslist = cslist.ChangesetList(self.repo) self.cslist.update(self.sourcelist) self.layout().addWidget(self.cslist) style = csinfo.panelstyle(selectable=True) self.srcb = srcb = QGroupBox() srcb.setLayout(QVBoxLayout()) srcb.layout().setContentsMargins(*(2,)*4) self.source = csinfo.create(self.repo, None, style, withupdate=True) self._updateSource(0) srcb.layout().addWidget(self.source) self.layout().addWidget(srcb) destb = QGroupBox( _('To graft destination')) destb.setLayout(QVBoxLayout()) destb.layout().setContentsMargins(*(2,)*4) dest = csinfo.create(self.repo, destrev, style, withupdate=True) destb.layout().addWidget(dest) self.destcsinfo = dest self.layout().addWidget(destb) sep = qtlib.LabeledSeparator(_('Options')) self.layout().addWidget(sep) self.autoresolvechk = QCheckBox(_('Automatically resolve merge conflicts ' 'where possible')) self.autoresolvechk.setChecked( self.repo.ui.configbool('tortoisehg', 'autoresolve', False)) self.layout().addWidget(self.autoresolvechk) self.currentuservechk = QCheckBox(_('Use my user name instead of graft ' 'committer user name')) self.layout().addWidget(self.currentuservechk) self.currentdatevechk = QCheckBox(_('Use current date')) self.layout().addWidget(self.currentdatevechk) self.logvechk = QCheckBox(_('Append graft info to log message')) self.layout().addWidget(self.logvechk) self.cmd = cmdui.Widget(True, True, self) self.cmd.commandFinished.connect(self.commandFinished) self.showMessage.connect(self.cmd.stbar.showMessage) self.cmd.stbar.linkActivated.connect(self.linkActivated) self.layout().addWidget(self.cmd, 2) bbox = QDialogButtonBox() self.cancelbtn = bbox.addButton(QDialogButtonBox.Cancel) self.cancelbtn.clicked.connect(self.reject) self.graftbtn = bbox.addButton(_('Graft'), QDialogButtonBox.ActionRole) self.graftbtn.clicked.connect(self.graft) self.abortbtn = bbox.addButton(_('Abort'), QDialogButtonBox.ActionRole) self.abortbtn.clicked.connect(self.abort) self.layout().addWidget(bbox) self.bbox = bbox self.th = None if self.checkResolve(): self.abortbtn.setEnabled(True) else: self.showMessage.emit(_('Checking...')) self.abortbtn.setEnabled(False) self.graftbtn.setEnabled(False) QTimer.singleShot(0, self.checkStatus) self.setMinimumWidth(480) self.setMaximumHeight(800) self.resize(0, 340) self.setWindowTitle(_('Graft - %s') % self.repo.displayname)
def __init__(self, repo, parent, **opts): super(ImportDialog, self).__init__(parent) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint | Qt.WindowMaximizeButtonHint) self.setWindowIcon(qtlib.geticon('hg-import')) self.tempfiles = [] self.repo = repo # base layout box box = QVBoxLayout() box.setSpacing(6) ## main layout grid self.grid = grid = QGridLayout() grid.setSpacing(6) box.addLayout(grid) ### source input self.src_combo = QComboBox() self.src_combo.setEditable(True) self.src_combo.setMinimumWidth(310) self.file_btn = QPushButton(_('Browse...')) self.file_btn.setAutoDefault(False) self.file_btn.clicked.connect(self.browsefiles) self.dir_btn = QPushButton(_('Browse Directory...')) self.dir_btn.setAutoDefault(False) self.dir_btn.clicked.connect(self.browsedir) self.clip_btn = QPushButton(_('Import from Clipboard')) self.clip_btn.setAutoDefault(False) self.clip_btn.clicked.connect(self.getcliptext) grid.addWidget(QLabel(_('Source:')), 0, 0) grid.addWidget(self.src_combo, 0, 1) srcbox = QHBoxLayout() srcbox.addWidget(self.file_btn) srcbox.addWidget(self.dir_btn) srcbox.addWidget(self.clip_btn) grid.addLayout(srcbox, 1, 1) self.p0chk = QCheckBox( _('Do not strip paths (-p0), ' 'required for SVN patches')) grid.addWidget(self.p0chk, 2, 1, Qt.AlignLeft) ### patch list self.cslist = cslist.ChangesetList(self.repo) self.cslistrow = cslistrow = 4 self.cslistcol = cslistcol = 1 grid.addWidget(self.cslist, cslistrow, cslistcol, Qt.AlignLeft | Qt.AlignTop) grid.addWidget(QLabel(_('Preview:')), 3, 0, Qt.AlignLeft | Qt.AlignTop) statbox = QHBoxLayout() self.status = QLabel("") statbox.addWidget(self.status) self.targetcombo = QComboBox() self.targetcombo.currentIndexChanged.connect(self.updatestatus) self.targetcombo.addItem(_('Repository')) self.targetcombo.addItem(_('Shelf')) self.targetcombo.addItem(_('Working Directory')) cur = self.repo.getcurrentqqueue() if cur: self.targetcombo.addItem(hglib.tounicode(cur)) statbox.addWidget(self.targetcombo) grid.addItem(statbox, 3, 1) ## command widget self.cmd = cmdui.Widget(True, False, self) self.cmd.commandStarted.connect(self.command_started) self.cmd.commandFinished.connect(self.command_finished) self.cmd.commandCanceling.connect(self.command_canceling) grid.setRowStretch(cslistrow, 1) grid.setColumnStretch(cslistcol, 1) box.addWidget(self.cmd) self.stlabel = QLabel(_('Checking working directory status...')) self.stlabel.linkActivated.connect(self.commitActivated) box.addWidget(self.stlabel) QTimer.singleShot(0, self.checkStatus) ## bottom buttons buttons = QDialogButtonBox() self.cancel_btn = buttons.addButton(QDialogButtonBox.Cancel) self.cancel_btn.clicked.connect(self.cancel_clicked) self.close_btn = buttons.addButton(QDialogButtonBox.Close) self.close_btn.clicked.connect(self.reject) self.close_btn.setAutoDefault(False) self.import_btn = buttons.addButton(_('&Import'), QDialogButtonBox.ActionRole) self.import_btn.clicked.connect(self.thgimport) self.detail_btn = buttons.addButton(_('Detail'), QDialogButtonBox.ResetRole) self.detail_btn.setAutoDefault(False) self.detail_btn.setCheckable(True) self.detail_btn.toggled.connect(self.detail_toggled) box.addWidget(buttons) # signal handlers self.src_combo.editTextChanged.connect(lambda *a: self.preview()) self.src_combo.lineEdit().returnPressed.connect(self.thgimport) self.p0chk.toggled.connect(lambda *a: self.preview()) # dialog setting self.setLayout(box) self.layout().setSizeConstraint(QLayout.SetMinAndMaxSize) self.setWindowTitle(_('Import - %s') % self.repo.displayname) #self.setWindowIcon(qtlib.geticon('import')) # prepare to show self.src_combo.lineEdit().selectAll() self.cslist.setHidden(False) self.cmd.setHidden(True) self.cancel_btn.setHidden(True) self.detail_btn.setHidden(True) self.p0chk.setHidden(False) self.preview()
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)