by
Changes to 14 files · Browse files at 36e87958af73 Showing diff from parent ca666161b014 ed75d8f72a86 Diff from another changeset...
@@ -334,6 +334,15 @@ if '--version' not in sys.argv:
raise
+ # Allow use of environment variables to specify the location of Mercurial
+ import modulefinder
+ path = os.getenv('MERCURIAL_PATH')
+ if path:
+ modulefinder.AddPackagePath('mercurial', path)
+ path = os.getenv('HGEXT_PATH')
+ if path:
+ modulefinder.AddPackagePath('hgext', path)
+
if 'py2exe' in sys.argv:
import hgext
hgextdir = os.path.dirname(hgext.__file__)
|
@@ -60,6 +60,8 @@ grid.addWidget(newbranch, 1, 0)
grid.addWidget(branchCombo, 1, 1)
grid.addWidget(closebranch, 2, 0)
+ grid.setColumnStretch(0, 0)
+ grid.setColumnStretch(1, 1)
layout.addLayout(grid)
newbranch.toggled.connect(branchCombo.setEnabled)
|
@@ -7,7 +7,7 @@ # This software may be used and distributed according to the terms of the
# GNU General Public License version 2, incorporated herein by reference.
-import os, string
+import os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
@@ -55,7 +55,6 @@ self.src_combo = QComboBox()
self.src_combo.setEditable(True)
self.src_combo.setMinimumWidth(310)
- self.src_combo.lineEdit().returnPressed.connect(self.clone)
self.src_btn = QPushButton(_('Browse...'))
self.src_btn.setAutoDefault(False)
self.src_btn.clicked.connect(self.browse_src)
@@ -114,8 +113,9 @@ if btnlabel:
btn = QPushButton(btnlabel)
btn.setEnabled(False)
- btn.setAutoDefault = 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))
@@ -196,6 +196,8 @@ # 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)
@@ -436,6 +438,10 @@ self.qclone_txt.setFocus()
self.composeCommand()
+ @pyqtSlot(QString)
+ def onResetDefault(self, text):
+ self.clone_btn.setDefault(True)
+
def command_started(self):
self.cmd.setShown(True)
self.clone_btn.setHidden(True)
@@ -451,7 +457,7 @@ self.detail_btn.setChecked(True)
self.clone_btn.setShown(True)
self.close_btn.setShown(True)
- self.close_btn.setAutoDefault(True)
+ self.close_btn.setDefault(True)
self.close_btn.setFocus()
self.cancel_btn.setHidden(True)
else:
|
@@ -512,6 +512,7 @@ self.setFocusProxy(self._logwidget)
self.setRepository(None)
self.openPrompt()
+ self.suppressPrompt = False
def _initlogwidget(self):
self._logwidget = _LogWidgetForConsole(self)
@@ -566,7 +567,8 @@ try:
self._logwidget.appendLog(msg, label)
finally:
- self.openPrompt()
+ if not self.suppressPrompt:
+ self.openPrompt()
@pyqtSlot(object)
def setRepository(self, repo):
@@ -626,6 +628,7 @@
@_cmdtable
def _cmd_hg(self, args):
+ self.closePrompt()
if self._repo:
args = ['--cwd', self._repo.root] + args
self._cmdcore.run(args)
|
@@ -38,6 +38,8 @@ progress = pyqtSignal(QString, object, QString, QString, object)
output = pyqtSignal(QString, QString)
makeLogVisible = pyqtSignal(bool)
+ beginSuppressPrompt = pyqtSignal()
+ endSuppressPrompt = pyqtSignal()
def __init__(self, repo, pats, opts, embedded=False, parent=None, rev=None):
QWidget.__init__(self, parent=parent)
@@ -70,6 +72,8 @@ self.runner.output.connect(self.output)
self.runner.progress.connect(self.progress)
self.runner.makeLogVisible.connect(self.makeLogVisible)
+ self.runner.commandStarted.connect(self.beginSuppressPrompt)
+ self.runner.commandFinished.connect(self.endSuppressPrompt)
self.runner.commandFinished.connect(self.commandFinished)
layout = QVBoxLayout()
|
@@ -354,6 +354,14 @@ self._repo.invalidateui() # force reloading config immediately
self._filldefaults()
+ @pyqtSlot()
+ def on_selectall_button_clicked(self):
+ self._changesets.selectAll()
+
+ @pyqtSlot()
+ def on_selectnone_button_clicked(self):
+ self._changesets.selectNone()
+
class _ChangesetsModel(QAbstractTableModel): # TODO: use component of log viewer?
_COLUMNS = [('rev', lambda ctx: '%d:%s' % (ctx.rev(), ctx)),
('author', lambda ctx: hglib.username(ctx.user())),
@@ -437,6 +445,19 @@
return QVariant(self._COLUMNS[section][0].capitalize())
+ def selectAll(self):
+ self._selectedrevs = set(self._revs)
+ self.updateAll()
+
+ def selectNone(self):
+ self._selectedrevs = set()
+ self.updateAll()
+
+ def updateAll(self):
+ first = self.createIndex(0, 0)
+ last = self.createIndex(len(self._revs) - 1, 0)
+ self.dataChanged.emit(first, last)
+
def run(ui, *revs, **opts):
# TODO: same options as patchbomb
if opts.get('rev'):
|
@@ -7,7 +7,7 @@ <x>0</x>
<y>0</y>
<width>660</width>
- <height>506</height>
+ <height>519</height>
</rect>
</property>
<property name="windowTitle">
@@ -357,6 +357,37 @@ </property>
</widget>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="selectallnone_layout">
+ <item>
+ <widget class="QPushButton" name="selectall_button">
+ <property name="text">
+ <string>Select &All</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="selectnone_button">
+ <property name="text">
+ <string>Select &None</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="selectallnone_spacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
</widget>
|
@@ -545,12 +545,12 @@ try:
char = s[s.index('&')+1].lower()
self.hotkeys[char] = btn
- if default == i:
- self.setDefaultButton(btn)
- if esc == i:
- self.setEscapeButton(btn)
except (ValueError, IndexError):
pass
+ if default == i:
+ self.setDefaultButton(btn)
+ if esc == i:
+ self.setEscapeButton(btn)
def run(self):
return self.exec_()
|
@@ -80,6 +80,12 @@ if self.command == 'revert':
## no backup checkbox
chk = QCheckBox(_('Do not save backup files (*.orig)'))
+ elif self.command == 'remove':
+ ## force checkbox
+ chk = QCheckBox(_('Force removal of modified files (--force)'))
+ else:
+ chk = None
+ if chk:
self.chk = chk
hbox.addWidget(chk)
@@ -119,7 +125,10 @@ stwidget.loadSettings(s, 'quickop')
self.restoreGeometry(s.value('quickop/geom').toByteArray())
if hasattr(self, 'chk'):
- self.chk.setChecked(s.value('quickop/nobackup', True).toBool())
+ if self.command == 'revert':
+ self.chk.setChecked(s.value('quickop/nobackup', True).toBool())
+ elif self.command == 'remove':
+ self.chk.setChecked(s.value('quickop/forceremove', False).toBool())
self.stwidget = stwidget
self.stwidget.refreshWctx()
QShortcut(QKeySequence('Ctrl+Return'), self, self.accept)
@@ -139,19 +148,41 @@ def accept(self):
cmdline = [self.command]
if hasattr(self, 'chk') and self.chk.isChecked():
- cmdline.append('--no-backup')
+ if self.command == 'revert':
+ cmdline.append('--no-backup')
+ elif self.command == 'remove':
+ cmdline.append('--force')
files = self.stwidget.getChecked()
if not files:
qtlib.WarningMsgBox(_('No files selected'),
_('No operation to perform'),
parent=self)
return
+ self.repo.bfstatus = True
+ self.repo.lfstatus = True
+ repostate = self.repo.status()
+ self.repo.bfstatus = False
+ self.repo.lfstatus = False
if self.command == 'remove':
- self.repo.bfstatus = True
- self.repo.lfstatus = True
- repostate = self.repo.status()
- self.repo.bfstatus = False
- self.repo.lfstatus = False
+ if not self.chk.isChecked():
+ modified = repostate[0]
+ selmodified = []
+ for wfile in files:
+ if wfile in modified:
+ selmodified.append(wfile)
+ if selmodified:
+ prompt = qtlib.CustomPrompt(_('Confirm Remove'),
+ _('You have selected one or more files that have been '
+ 'modified. By default, these files will not be '
+ 'removed. What would you like to do?'), self,
+ (_('Remove &Unmodified Files'),
+ _('Remove &All Selected Files'), _('Cancel')),
+ 0, 2, selmodified)
+ ret = prompt.run()
+ if ret == 1:
+ cmdline.append('--force')
+ elif ret == 2:
+ return
unknown, ignored = repostate[4:6]
for wfile in files:
if wfile in unknown or wfile in ignored:
@@ -181,7 +212,10 @@ self.stwidget.saveSettings(s, 'quickop')
s.setValue('quickop/geom', self.saveGeometry())
if hasattr(self, 'chk'):
- s.setValue('quickop/nobackup', self.chk.isChecked())
+ if self.command == 'revert':
+ s.setValue('quickop/nobackup', self.chk.isChecked())
+ elif self.command == 'remove':
+ s.setValue('quickop/forceremove', self.chk.isChecked())
QDialog.reject(self)
def addLfiles(self):
|
@@ -44,6 +44,8 @@ output = pyqtSignal(QString, QString)
progress = pyqtSignal(QString, object, QString, QString, object)
makeLogVisible = pyqtSignal(bool)
+ beginSuppressPrompt = pyqtSignal()
+ endSuppressPrompt = pyqtSignal()
repoChanged = pyqtSignal(QString)
@@ -116,6 +118,8 @@ self.runner.output.connect(self.output)
self.runner.progress.connect(self.progress)
self.runner.makeLogVisible.connect(self.makeLogVisible)
+ self.runner.commandStarted.connect(self.beginSuppressPrompt)
+ self.runner.commandFinished.connect(self.endSuppressPrompt)
self.runner.commandFinished.connect(self.onCommandFinished)
# Select the widget chosen by the user
@@ -296,12 +300,16 @@ w.setFocus() # to handle key press by InfoBar
return w
+ @pyqtSlot()
def clearInfoBar(self, priority=None):
"""Close current infobar if available; return True if got empty"""
it = self._infobarlayout.itemAt(0)
if not it:
return True
if priority is None or it.widget().infobartype <= priority:
+ # removes current infobar explicitly, because close() seems to
+ # delay deletion until next eventloop.
+ self._infobarlayout.removeItem(it)
it.widget().close()
return True
else:
@@ -339,6 +347,8 @@ cw.output.connect(self.output)
cw.progress.connect(self.progress)
cw.makeLogVisible.connect(self.makeLogVisible)
+ cw.beginSuppressPrompt.connect(self.beginSuppressPrompt)
+ cw.endSuppressPrompt.connect(self.endSuppressPrompt)
cw.linkActivated.connect(self._openLink)
cw.showMessage.connect(self.showMessage)
QTimer.singleShot(0, cw.reload)
@@ -363,6 +373,9 @@ sw.output.connect(self._showOutputOnInfoBar)
sw.progress.connect(self.progress)
sw.makeLogVisible.connect(self.makeLogVisible)
+ sw.beginSuppressPrompt.connect(self.beginSuppressPrompt)
+ sw.endSuppressPrompt.connect(self.endSuppressPrompt)
+ sw.syncStarted.connect(self.clearInfoBar)
sw.outgoingNodes.connect(self.setOutgoingNodes)
sw.showMessage.connect(self.showMessage)
sw.showMessage.connect(self._showMessageOnInfoBar)
@@ -741,6 +754,7 @@
def onRevisionClicked(self, rev):
'User clicked on a repoview row'
+ self.clearInfoBar(qtlib.InfoBar.INFO)
tw = self.taskTabsWidget
cw = tw.currentWidget()
if not cw.canswitch():
@@ -756,7 +770,6 @@ def onRevisionSelected(self, rev):
'View selection changed, could be a reload'
self.showMessage('')
- self.clearInfoBar(qtlib.InfoBar.INFO)
if self.repomodel.graph is None:
return
try:
|
|
|
@@ -36,7 +36,8 @@ port = m.group(3)
folder = m.group(5) or '.'
else:
- qtlib.WarningMsgBox(_('Malformed ssh URL'), hglib.tounicode(path))
+ qtlib.WarningMsgBox(_('Malformed ssh URL'), hglib.tounicode(path),
+ parent=self)
host, port, folder = '', '', ''
elif path.startswith(('http://', 'https://', 'svn+https://')):
snpaqf = urlparse.urlparse(path)
@@ -51,6 +52,7 @@ return user, host, port, folder, passwd, scheme
class SyncWidget(QWidget, qtlib.TaskWidget):
+ syncStarted = pyqtSignal() # incoming/outgoing/pull/push started
outgoingNodes = pyqtSignal(object)
incomingBundle = pyqtSignal(QString)
showMessage = pyqtSignal(unicode)
@@ -60,6 +62,8 @@ output = pyqtSignal(QString, QString)
progress = pyqtSignal(QString, object, QString, QString, object)
makeLogVisible = pyqtSignal(bool)
+ beginSuppressPrompt = pyqtSignal()
+ endSuppressPrompt = pyqtSignal()
showBusyIcon = pyqtSignal(QString)
hideBusyIcon = pyqtSignal(QString)
@@ -287,11 +291,16 @@ self.optionsbutton.pressed.connect(self.editOptions)
cmd = cmdui.Widget(not self.embedded, True, self)
+ cmd.commandStarted.connect(self.beginSuppressPrompt)
cmd.commandStarted.connect(self.commandStarted)
+ cmd.commandFinished.connect(self.endSuppressPrompt)
cmd.commandFinished.connect(self.commandFinished)
cmd.makeLogVisible.connect(self.makeLogVisible)
cmd.output.connect(self.output)
+ cmd.output.connect(self.outputHook)
cmd.progress.connect(self.progress)
+ if not self.embedded:
+ self.showMessage.connect(cmd.stbar.showMessage)
bottomlayout.addWidget(cmd)
cmd.setVisible(False)
@@ -649,6 +658,7 @@ def run(self, cmdline, details):
if self.cmd.core.running():
return
+ self.lastcmdline = list(cmdline)
for name in list(details) + ['remotecmd']:
val = self.opts.get(name)
if not val:
@@ -705,6 +715,10 @@ self.repo.incrementBusyCount()
self.cmd.run(cmdline, display=display, useproc='p4://' in cururl)
+ def outputHook(self, msg, label):
+ if '\'hg push --new-branch\'' in msg:
+ self.needNewBranch = True
+
##
## Workbench toolbar buttons
##
@@ -752,6 +766,7 @@ ##
def inclicked(self):
+ self.syncStarted.emit()
url = self.currentUrl(True)
urlu = hglib.tounicode(url)
self.showMessage.emit(_('Getting incoming changesets from %s...') % urlu)
@@ -787,6 +802,7 @@ self.run(cmdline, ('force', 'branch', 'rev', 'subrepos'))
def pullclicked(self):
+ self.syncStarted.emit()
url = self.currentUrl(True)
urlu = hglib.tounicode(url)
def finished(ret, output):
@@ -825,6 +841,7 @@ self.run(cmdline, ('force', 'branch', 'rev', 'bookmark'))
def outclicked(self):
+ self.syncStarted.emit()
url = self.currentUrl(True)
urlu = hglib.tounicode(url)
self.showMessage.emit(_('Finding outgoing changesets to %s...') % urlu)
@@ -898,13 +915,15 @@ self.run(['--repository', self.repo.root, 'p4pending', '--verbose'], ())
def pushclicked(self, confirm, rev=None, branch=None):
+ validopts = ('force', 'new-branch', 'branch', 'rev', 'bookmark')
+ self.syncStarted.emit()
url = self.currentUrl(True)
urlu = hglib.tounicode(url)
if (not hg.islocal(self.currentUrl(False)) and confirm
and not self.targetcheckbox.isChecked()):
r = qtlib.QuestionMsgBox(_('Confirm Push to remote Repository'),
_('Push to remote repository\n%s\n?')
- % urlu)
+ % urlu, parent=self)
if not r:
self.showMessage.emit(_('Push to %s aborted') % urlu)
self.pushCompleted.emit()
@@ -916,6 +935,18 @@ self.showMessage.emit(_('Push to %s completed') % urlu)
else:
self.showMessage.emit(_('Push to %s aborted, ret %d') % (urlu, ret))
+ if self.needNewBranch:
+ r = qtlib.QuestionMsgBox(_('Confirm New Branch'),
+ _('One or more of the changesets that you '
+ 'are attempting to push involve the '
+ 'creation of a new branch. Do you want '
+ 'to create a new branch in the remote '
+ 'repository?'), parent=self)
+ if r:
+ cmdline = self.lastcmdline
+ cmdline.extend(['--new-branch'])
+ self.run(cmdline, validopts)
+ return
self.pushCompleted.emit()
self.finishfunc = finished
cmdline = ['--repository', self.repo.root, 'push']
@@ -923,7 +954,8 @@ cmdline.extend(['--rev', str(rev)])
if branch:
cmdline.extend(['--branch', branch])
- self.run(cmdline, ('force', 'new-branch', 'branch', 'rev', 'bookmark'))
+ self.needNewBranch = False
+ self.run(cmdline, validopts)
def postpullclicked(self):
dlg = PostPullDialog(self.repo, self)
@@ -1155,7 +1187,7 @@ path = self.origurl
if alias in cfg['paths']:
if not qtlib.QuestionMsgBox(_('Confirm URL replace'),
- _('%s already exists, replace URL?') % alias):
+ _('%s already exists, replace URL?') % alias, parent=self):
return
cfg.set('paths', alias, path)
self.repo.incrementBusyCount()
|
@@ -309,12 +309,12 @@ from tortoisehg.hgqt.guess import DetectRenameDialog
dlg = DetectRenameDialog(repo, parent, *files)
def matched():
- ret = True
- ret = False
+ ret[0] = True
+ ret = [False]
dlg.matchAccepted.connect(matched)
dlg.finished.connect(dlg.deleteLater)
dlg.exec_()
- return ret
+ return ret[0]
def ignore(parent, ui, repo, files):
from tortoisehg.hgqt.hgignore import HgignoreDialog
|
@@ -644,6 +644,8 @@ self.statusbar.progress(tp, p, i, u, tl, repo.root))
rw.output.connect(self.log.output)
rw.makeLogVisible.connect(self.log.setShown)
+ rw.beginSuppressPrompt.connect(self.log.beginSuppressPrompt)
+ rw.endSuppressPrompt.connect(self.log.endSuppressPrompt)
rw.revisionSelected.connect(self.updateHistoryActions)
rw.repoLinkClicked.connect(self.openLinkedRepo)
rw.taskTabsWidget.currentChanged.connect(self.updateTaskViewMenu)
|
Loading...