by
Changes to 42 files · Browse files at fae4a3d87bc6 Showing diff from parent 03336492eb5f 8e0de7ad07fd Diff from another changeset...
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
|
@@ -166,13 +166,14 @@ output = pyqtSignal(QString, QString)
makeLogVisible = pyqtSignal(bool)
- def __init__(self, repo, pats, opts, embedded=False, parent=None):
+ def __init__(self, repo, pats, opts, embedded=False, parent=None, rev=None):
QWidget.__init__(self, parent=parent)
repo.configChanged.connect(self.configChanged)
repo.repositoryChanged.connect(self.repositoryChanged)
repo.workingBranchChanged.connect(self.workingBranchChanged)
self.repo = repo
+ self._rev = rev
self.lastAction = None
self.lastCommitMsg = ''
self.currentAction = None
@@ -308,6 +309,46 @@ QShortcut(QKeySequence('Ctrl+Enter'), self,
self.commit).setContext(Qt.WidgetWithChildrenShortcut)
+ @property
+ def rev(self):
+ """Return current revision"""
+ return self._rev
+
+ def selectRev(self, rev):
+ """
+ Select the revision that must be set when the dialog is shown again
+ """
+ self._rev = rev
+
+ @pyqtSlot(int)
+ @pyqtSlot(object)
+ def setRev(self, rev):
+ """Change revision to show"""
+ self.selectRev(rev)
+ if self.hasmqbutton:
+ preferredActionName = self._getPreferredActionName()
+ curractionName = self.mqgroup.checkedAction()._name
+ if curractionName != preferredActionName:
+ self.mqSetAction(refresh=True,
+ actionName=preferredActionName)
+
+ def _getPreferredActionName(self):
+ """Select the preferred action, depending on the selected revision"""
+ if not self.hasmqbutton:
+ return 'commit'
+ else:
+ pctx = self.repo.changectx('.')
+ ispatch = 'qtip' in pctx.tags()
+ if not ispatch:
+ # Set the button to Commit
+ return 'commit'
+ elif self.rev is None:
+ # Set the button to QNew
+ return 'qnew'
+ else:
+ # Set the button to QRefresh
+ return 'qref'
+
def mqSetupButton(self):
ispatch = lambda r: 'qtip' in r.changectx('.').tags()
notpatch = lambda r: 'qtip' not in r.changectx('.').tags()
@@ -364,13 +405,11 @@ action._enablefunc = a[3]
action.triggered.connect(menurefresh)
action.setCheckable(True)
- if a[3] and a[3](self.repo):
- action.setChecked(True)
mqmenu.addAction(action)
mqtb.setMenu(mqmenu)
mqtb.clicked.connect(self.mqPerformAction)
self.mqButtonEnable.connect(mqtb.setEnabled)
- self.mqSetAction()
+ self.mqSetAction(actionName=self._getPreferredActionName())
sc = QShortcut(QKeySequence('Ctrl+Return'), self, self.mqPerformAction)
sc.setContext(Qt.WidgetWithChildrenShortcut)
sc = QShortcut(QKeySequence('Ctrl+Enter'), self, self.mqPerformAction)
@@ -378,7 +417,12 @@ return mqtb
@pyqtSlot(bool)
- def mqSetAction(self, refresh=False):
+ def mqSetAction(self, refresh=False, actionName=None):
+ if actionName:
+ selectedAction = \
+ [act for act in self.mqgroup.actions() \
+ if act._name == actionName][0]
+ selectedAction.setChecked(True)
curraction = self.mqgroup.checkedAction()
oldpctx = self.stwidget.pctx
pctx = self.repo.changectx('.')
@@ -425,7 +469,7 @@ '''
Create the command line to change or create the selected branch unless
it is the selected branch
-
+
Verify whether a branch exists on a repo. If it doesn't ask the user
to confirm that it wants to create the branch. If it does and it is not
the current branch as the user whether it wants to change to that branch.
@@ -465,7 +509,7 @@ elif resp == 2:
return None, False
return commandlines, newbranch
-
+
@pyqtSlot()
def mqPerformAction(self):
curraction = self.mqgroup.checkedAction()
@@ -475,7 +519,7 @@ # Check if we need to change branch first
commandlines = []
if self.branchop:
- commandlines, newbranch = self.getBranchCommandLine(self.branchop,
+ commandlines, newbranch = self.getBranchCommandLine(self.branchop,
self.repo)
if commandlines is None:
return
|
@@ -17,12 +17,13 @@ Qt4 dialogs to display hg revisions of a file
"""
+import os
import difflib
from tortoisehg.util import hglib
from tortoisehg.hgqt.i18n import _
from tortoisehg.hgqt import qtlib, visdiff, filerevmodel, blockmatcher, lexers
-from tortoisehg.hgqt import fileview, repoview, revpanel
+from tortoisehg.hgqt import fileview, repoview, revpanel, revert
from PyQt4.QtCore import *
from PyQt4.QtGui import *
@@ -205,6 +206,16 @@ a = menu.addAction(_('Diff file to local...'))
a.setIcon(qtlib.getmenuicon('ldiff'))
a.triggered.connect(self.onVisualDiffFileToLocal)
+ menu.addSeparator()
+ a = menu.addAction(_('View at revision...'))
+ a.setIcon(qtlib.getmenuicon('view-at-revision'))
+ a.triggered.connect(self.onViewFileAtRevision)
+ a = menu.addAction(_('Edit local'))
+ a.setIcon(qtlib.getmenuicon('edit-file'))
+ a.triggered.connect(self.onEditLocal)
+ a = menu.addAction(_('Revert to revision...'))
+ a.setIcon(qtlib.getmenuicon('hg-revert'))
+ a.triggered.connect(self.onRevertFileToRevision)
self.selection = selection
self.menu.exec_(point)
@@ -240,6 +251,38 @@ dlg.exec_()
dlg.deleteLater()
+ def onEditLocal(self):
+ filenames = [self.filename]
+ if not filenames:
+ return
+ qtlib.editfiles(self.repo, filenames, parent=self)
+
+ def onRevertFileToRevision(self):
+ rev = self.selection[0]
+ if rev is None:
+ rev = self.repo['.'].rev()
+ fileSelection = [self.filerevmodel.graph.filename(rev)]
+ if len(fileSelection) == 0:
+ return
+ dlg = revert.RevertDialog(self.repo, fileSelection, rev, self)
+ if dlg:
+ dlg.exec_()
+ dlg.deleteLater()
+
+ def onViewFileAtRevision(self):
+ rev = self.selection[0]
+ filenames = [self.filerevmodel.graph.filename(rev)]
+ if not filenames:
+ return
+ if rev is None:
+ qtlib.editfiles(self.repo, filenames, parent=self)
+ else:
+ base, _ = visdiff.snapshot(self.repo, filenames, self.repo[rev])
+ files = [os.path.join(base, filename)
+ for filename in filenames]
+ qtlib.editfiles(self.repo, files, parent=self)
+
+
@pyqtSlot(QString)
def onLinkActivated(self, link):
link = unicode(link)
|
@@ -244,7 +244,7 @@ remdests[dest] = src
for dest, src in remdests.iteritems():
if not os.path.exists(self.repo.wjoin(src)):
- wctx.remove([src]) # !->R
+ wctx.forget([src]) # !->R
wctx.copy(src, dest)
self.matchtv.model().remove(dest)
self.matchAccepted.emit()
|
@@ -111,10 +111,10 @@ mainlayout.addWidget(w)
self.qpushAllAct = a = QAction(
- geticon('hg-qpush-all'), _('Push all'), self)
+ geticon('hg-qpush-all'), _('Push all', 'MQ QPush'), self)
a.setToolTip(_('Apply all patches'))
self.qpushAct = a = QAction(
- geticon('hg-qpush'), _('Push'), self)
+ geticon('hg-qpush'), _('Push', 'MQ QPush'), self)
a.setToolTip(_('Apply one patch'))
self.setGuardsAct = a = QAction(
geticon('hg-qguard'), _('Guards'), self)
|
@@ -205,6 +205,9 @@ text=_('Branch'), popupMode=QToolButton.InstantPopup,
statusTip=_('Display graph the named branch only'))
self._branchMenu = QMenu(self._branchLabel)
+ self._abranchAction = self._branchMenu.addAction(
+ _('Display only active branches'), self.refresh)
+ self._abranchAction.setCheckable(True)
self._cbranchAction = self._branchMenu.addAction(
_('Display closed branches'), self.refresh)
self._cbranchAction.setCheckable(True)
@@ -226,7 +229,11 @@ """Update the list of branches"""
curbranch = self.branch()
- if self._cbranchAction.isChecked():
+ if self._abranchAction.isChecked():
+ branches = sorted(set([self._repo[n].branch()
+ for n in self._repo.heads()
+ if not self._repo[n].extra().get('close')]))
+ elif self._cbranchAction.isChecked():
branches = sorted(self._repo.branchtags().keys())
else:
branches = self._repo.namedbranches
|
@@ -35,7 +35,7 @@ # TODO: Remove these two when we adopt GTK author color scheme
COLORS = [ "blue", "darkgreen", "red", "green", "darkblue", "purple",
"cyan", Qt.darkYellow, "magenta", "darkred", "darkmagenta",
- "darkcyan", "gray", "yellow", ]
+ "darkcyan", "gray", ]
COLORS = [str(QColor(x).name()) for x in COLORS]
COLUMNHEADERS = (
@@ -588,7 +588,7 @@ msg = '*** ' + _('Working Directory') + ' ***'
for pctx in ctx.parents():
- if pctx.node() not in self.repo._branchheads:
+ if self.repo._branchheads and pctx.node() not in self.repo._branchheads:
text = _('Not a head revision!')
msg += " " + qtlib.markup(text, fg='red', weight='bold')
|
|
|
@@ -70,6 +70,7 @@ self.revsetfilter = False
self.ubranch = u''
self.bundle = None
+ self.outgoingMode = False
self.revset = []
self.busyIcons = []
self.namedTabs = {}
@@ -270,7 +271,7 @@
def createCommitWidget(self):
pats, opts = {}, {}
- cw = CommitWidget(self.repo, pats, opts, True, self)
+ cw = CommitWidget(self.repo, pats, opts, True, self, rev=self.rev)
if cw.hasmqbutton:
cw.buttonHBox.addWidget(cw.mqSetupButton())
@@ -418,6 +419,7 @@ @pyqtSlot()
def clearRevisionSet(self):
self.toolbarVisibilityChanged.emit()
+ self.outgoingMode = False
if not self.revset:
return
self.revset = []
@@ -510,7 +512,7 @@ self.generateUnappliedPatchMenu()
self.generateMultipleSelectionMenu()
self.generateBundleMenu()
-
+ self.generateOutgoingMenu()
def detectPatches(self, paths):
filepaths = []
for p in paths:
@@ -708,14 +710,17 @@ try:
self.revDetailsWidget.onRevisionSelected(rev)
self.revisionSelected.emit(rev)
- if type(rev) != str: # unapplied patch
+ if type(rev) != str:
+ # Regular patch or working directory
if self.manifestDemand.isHidden():
self.manifestDemand.forward('selectRev', rev)
else:
self.manifestDemand.forward('setRev', rev)
self.grepDemand.forward('setRevision', rev)
self.syncDemand.forward('refreshTargets', rev)
+ self.commitDemand.forward('setRev', rev)
else:
+ # unapplied patch
if self.manifestDemand.isHidden():
self.manifestDemand.forward('selectRev', None)
else:
@@ -942,10 +947,9 @@
def pull(self):
self.syncDemand.get().pull()
-
def outgoing(self):
self.syncDemand.get().outgoing()
-
+ self.outgoingMode = True
def push(self, confirm=True):
"""Call sync push.
@@ -953,7 +957,7 @@ confirmation. If confirm is True, the prompt might be used.
"""
self.syncDemand.get().push(confirm)
-
+ self.outgoingMode = False
##
## Repoview context menu
##
@@ -972,6 +976,10 @@ if len(selection) == 1:
self.bundlemenu.exec_(point)
return
+ if self.outgoingMode:
+ if len(selection) == 1:
+ self.outgoingcmenu.exec_(point)
+ return
self.menuselection = selection
allunapp = False
@@ -1036,10 +1044,8 @@ self.unappacts[4].setEnabled(unapplied > 1)
self.unappacts[5].setEnabled(len(selection) == 1)
self.unappcmenu.exec_(point)
-
- def generateSingleMenu(self):
+ def generateSingleMenu(self, mode=None):
items = []
-
# This menu will never be opened for an unapplied patch, they
# have their own menu.
#
@@ -1070,20 +1076,19 @@ act.enableFunc = func
menu.addAction(act)
items.append(act)
-
menu = QMenu(self)
-
+ if mode == 'outgoing':
+ submenu = menu.addMenu(_('Push'))
+ entry(submenu, None, isrev, _('Push all'), 'hg-push',
+ self.pushToRevision)
+ entry(submenu, None, isrev, _('Push to here'), '',
+ self.pushToRevision)
+ entry(submenu, None, isrev, _('Push selected branch'), '',
+ self.pushBranch)
+ entry(menu)
entry(menu, None, isrev, _('Update...'), 'hg-update',
self.updateToRevision)
entry(menu)
- submenu = menu.addMenu(_('Push'))
- entry(submenu, None, isrev, _('Push all'), 'hg-push',
- self.pushToRevision)
- entry(submenu, None, isrev, _('Push to here'), '',
- self.pushToRevision)
- entry(submenu, None, isrev, _('Push selected branch'), '',
- self.pushBranch)
- entry(menu)
entry(menu, None, isctx, _('Visual diff...'), 'visualdiff',
self.visualDiffRevision)
entry(menu, None, isrev, _('Diff to local...'), 'ldiff',
@@ -1145,10 +1150,12 @@
entry(menu, 'rupdate', fixed, _('Remote Update...'), 'hg-update',
self.rupdate)
-
- self.singlecmenu = menu
- self.singlecmenuitems = items
-
+ if mode == 'outgoing':
+ self.outgoingcmenu = menu
+ self.outgoingcmenuitems = items
+ else:
+ self.singlecmenu = menu
+ self.singlecmenuitems = items
def generatePairMenu(self):
def dagrange():
revA, revB = self.menuselection
@@ -1355,6 +1362,8 @@ a.setIcon(qtlib.getmenuicon(icon))
menu.addAction(a)
self.bundlemenu = menu
+ def generateOutgoingMenu(self):
+ self.generateSingleMenu(mode='outgoing')
def exportRevisions(self, revisions):
if not revisions:
|
@@ -200,6 +200,7 @@ _('Toggle display of all files and the direction they were merged'))
self.actionShowAllMerge.setCheckable(True)
self.actionShowAllMerge.setChecked(False)
+ self.actionShowAllMerge.setEnabled(False)
self.filelisttbar.addAction(self.actionShowAllMerge)
self.actionNextLine = QAction('Next line', self)
|
@@ -438,7 +438,7 @@ u'</b> %(arg1)s'])
opts['values'] = [str(evalue), evalue.hint]
dlg = ExceptionMsgBox(hglib.tounicode(str(evalue)),
- errstr, opts,
+ hglib.tounicode(errstr), opts,
parent=self._mainapp.activeWindow())
elif etype is KeyboardInterrupt:
if qtlib.QuestionMsgBox(_('Keyboard interrupt'),
|
@@ -180,7 +180,7 @@
def renamefromto(repo, deleted, unknown):
repo[None].copy(deleted, unknown)
- repo[None].remove([deleted], unlink=False) # !->R
+ repo[None].forget([deleted]) # !->R
def copyPatch(parent, ui, repo, files):
ui.pushbuffer()
@@ -341,5 +341,6 @@
def resolve_with(tool, repo, files):
opts = {'tool': tool}
- commands.resolve(repo.ui, repo, *files, **opts)
+ paths = [repo.wjoin(f) for f in files]
+ commands.resolve(repo.ui, repo, *paths, **opts)
return True
|
@@ -26,7 +26,7 @@ <?define templates.coal.guid = {89768AB3-A942-470B-8C1C-9C026B80FF8E} ?>
<?define templates.gitweb.guid = {66F4305F-8AC6-4B55-AC24-30FFC3161EF0} ?>
<?define templates.monoblue.guid = {F1CC0065-B3D2-4D4C-BD7F-EFDBB4B47CBB} ?>
- <?define templates.paper.guid = {516308AA-E5F5-4545-BA2C-1FCB3EF0C649} ?>
+ <?define templates.paper.guid = {31BF16C5-3525-47F7-9733-F67A3B02171B} ?>
<?define templates.raw.guid = {936139F7-9A73-4685-80D2-F17A2BC42EAD} ?>
<?define templates.rss.guid = {891DA56F-B02B-456F-8471-FE47024051E7} ?>
<?define templates.spartan.guid = {C49A4A44-53EB-4C37-AA0B-159070F46E84} ?>
|
@@ -114,6 +114,7 @@ <File Id="paper.branches.tmpl" Name="branches.tmpl" KeyPath="yes" />
<File Id="paper.bookmarks.tmpl" Name="bookmarks.tmpl" />
<File Id="paper.changeset.tmpl" Name="changeset.tmpl" />
+ <File Id="paper.diffstat.tmpl" Name="diffstat.tmpl" />
<File Id="paper.error.tmpl" Name="error.tmpl" />
<File Id="paper.fileannotate.tmpl" Name="fileannotate.tmpl" />
<File Id="paper.filediff.tmpl" Name="filediff.tmpl" />
|
Loading...