Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 2.1, 2.1.1, and 2.1.2

Merge with stable

Changeset 06d05ce40d38

Parents e617ed8ab664

Parents 1ffc12ec41cf

by Adrian Buehlmann

Changes to 18 files · Browse files at 06d05ce40d38 Showing diff from parent e617ed8ab664 1ffc12ec41cf Diff from another changeset...

Show Entire File icons/​scalable/​actions/​hg-remove.svg Stacked
copied from icons/svg/remove.svg
(No changes)
 
174
175
176
177
 
 
 
 
178
179
180
 
187
188
189
 
 
190
191
192
 
174
175
176
 
177
178
179
180
181
182
183
 
190
191
192
193
194
195
196
197
@@ -174,7 +174,10 @@
  self._rev = ctx.rev()   self.clear()   self.annfile = wfile - self.setText(hglib.tounicode(fctx.data())) + if util.binary(fctx.data()): + self.setText(_('File is binary.\n')) + else: + self.setText(hglib.tounicode(fctx.data()))   if line:   self.setCursorPosition(int(line) - 1, 0)   self._updatelexer(fctx) @@ -187,6 +190,8 @@
  return   ctx = self.repo[self._rev]   fctx = ctx[hglib.fromunicode(self.annfile)] + if util.binary(fctx.data()): + return   self._thread.abort()   self._thread.start(fctx)  
 
223
224
225
 
 
 
 
 
 
223
224
225
226
227
228
229
230
@@ -223,3 +223,8 @@
  '--rename', namelocal, newnamelocal]   self.cmd.run(cmdline)   self.finishfunc = finished + + def reject(self): + # prevent signals from reaching deleted objects + self.repo.repositoryChanged.disconnect(self.refresh) + super(BookmarkDialog, self).reject()
 
140
141
142
143
 
144
145
146
 
277
278
279
280
281
 
 
 
 
282
283
284
 
140
141
142
 
143
144
145
146
 
277
278
279
 
 
280
281
282
283
284
285
286
@@ -140,7 +140,7 @@
    self.splitter = QSplitter(Qt.Vertical)   self.setCentralWidget(self.splitter) - self.repoview = HgRepoView(self.repo, self.splitter) + self.repoview = HgRepoView(self.repo, 'fileLogDialog', self.splitter)   self.contentframe = QFrame(self.splitter)     vbox = QVBoxLayout() @@ -277,8 +277,10 @@
  self.splitter = QSplitter(Qt.Vertical)   self.setCentralWidget(self.splitter)   self.horizontalLayout = QHBoxLayout() - self.tableView_revisions_left = HgRepoView(self.repo, self) - self.tableView_revisions_right = HgRepoView(self.repo, self) + self.tableView_revisions_left = HgRepoView(self.repo, + 'fileDiffDialogLeft', self) + self.tableView_revisions_right = HgRepoView(self.repo, + 'fileDiffDialogRight', self)   self.horizontalLayout.addWidget(self.tableView_revisions_left)   self.horizontalLayout.addWidget(self.tableView_revisions_right)   self.frame = QFrame()
 
629
630
631
632
 
633
634
635
 
629
630
631
 
632
633
634
635
@@ -629,7 +629,7 @@
  self.flabel += _(' <i>(was added, now missing)</i>')   return   - if status in ('I', '?'): + if status in ('I', '?', 'C'):   try:   data = open(repo.wjoin(wfile), 'r').read()   if '\0' in data:
 
703
704
705
706
707
 
 
 
708
709
710
 
703
704
705
 
 
706
707
708
709
710
711
@@ -703,8 +703,9 @@
  self._refreshFileListWidget()   except Exception, e:   self.showMessage.emit(hglib.tounicode(str(e))) - import traceback - traceback.print_exc() + if 'THGDEBUG' in os.environ: + import traceback + traceback.print_exc()   finally:   self.refreshing = False   if self.reselectFileItem:
 
30
31
32
33
34
 
 
 
35
36
37
 
30
31
32
 
 
33
34
35
36
37
38
@@ -30,8 +30,9 @@
    self.setLayout(QVBoxLayout())   - lbl = QLabel(_('<b>Remove patches from queue?<ul><li>%s</ul></b>') % - '<li>'.join(patches)) + msg = _('Remove patches from queue?') + patchesu = u'<li>'.join([hglib.tounicode(p) for p in patches]) + lbl = QLabel(u'<b>%s<ul><li>%s</ul></b>' % (msg, patchesu))   self.layout().addWidget(lbl)     self.keepchk = QCheckBox(_('Keep patch files'))
 
13
14
15
16
17
18
19
20
21
22
 
 
 
 
 
 
 
 
 
 
23
24
25
 
65
66
67
68
 
69
70
71
 
13
14
15
 
 
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
73
74
75
 
76
77
78
79
@@ -13,13 +13,21 @@
 import tempfile  import re   -from PyQt4.QtCore import * -from PyQt4.QtGui import *  from mercurial import extensions    from tortoisehg.util import hglib, paths, wconfig  from hgext.color import _styles   +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +if PYQT_VERSION_STR.split('.') < ['4', '7'] or \ + QT_VERSION_STR.split('.') < ['4', '6']: + sys.stderr.write('TortoiseHg requires Qt 4.6 and PyQt 4.7\n') + sys.stderr.write('You have Qt %s and PyQt %s\n' % + (QT_VERSION_STR, PYQT_VERSION_STR)) + sys.exit() +  tmproot = None  def gettempdir():   global tmproot @@ -65,7 +73,7 @@
  except EnvironmentError:   pass   else: - qtlib.WarningMsgBox(_('Unable to create a config file'), + WarningMsgBox(_('Unable to create a config file'),   _('Insufficient access rights.'), parent=parent)   return None, {}  
 
21
22
23
24
25
 
 
26
27
 
28
29
30
 
21
22
23
 
 
24
25
26
 
27
28
29
30
@@ -21,10 +21,10 @@
  'revert': (_('Checkmark files to revert'), _('Revert')),   'remove': (_('Checkmark files to remove'), _('Remove')),}   -ICONS = { 'add': 'add', - 'forget': 'remove', +ICONS = { 'add': 'fileadd', + 'forget': 'hg-remove',   'revert': 'hg-revert', - 'remove': 'remove',} + 'remove': 'hg-remove',}    class QuickOpDialog(QDialog):   """ Dialog for performing quick dirstate operations """
 
32
33
34
35
 
36
37
38
 
 
39
40
41
 
101
102
103
104
105
106
107
108
109
110
111
 
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
 
 
 
128
129
130
131
132
 
 
 
 
 
133
134
135
 
138
139
140
141
142
143
144
145
146
 
147
148
149
 
237
238
239
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
33
34
 
35
36
37
38
39
40
41
42
43
 
103
104
105
 
 
106
107
108
109
110
111
112
113
114
115
116
117
118
 
 
 
119
120
121
 
122
 
123
124
125
126
127
128
 
 
 
 
129
130
131
132
133
134
135
136
 
139
140
141
 
 
 
 
 
 
142
143
144
145
 
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
@@ -32,10 +32,12 @@
  menuRequested = pyqtSignal(QPoint, object)   showMessage = pyqtSignal(unicode)   - def __init__(self, repo, parent=None): + def __init__(self, repo, cfgname, parent=None):   QTableView.__init__(self, parent)   self.repo = repo   self.current_rev = -1 + self.resized = False + self.cfgname = cfgname   self.setShowGrid(False)     vh = self.verticalHeader() @@ -101,35 +103,34 @@
  self.setItemDelegateForColumn(c, self.standardDelegate)     def resizeColumns(self, *args): - # resize columns the smart way: the column holding Description - # is resized according to the total widget size.   if not self.model():   return   hh = self.horizontalHeader()   hh.setStretchLastSection(False)   self._resizeColumns()   hh.setStretchLastSection(True) + self.resized = True     def _resizeColumns(self):   # _resizeColumns misbehaves if called with last section streched   for c, w in enumerate(self._columnWidthHints()):   self.setColumnWidth(c, w)   - def sizeHintForColumn(self, column): - return self._columnWidthHints()[column] -   def _columnWidthHints(self):   """Return list of recommended widths of all columns"""   model = self.model() - col1_width = self.viewport().width()   fontm = QFontMetrics(self.font()) - tot_stretch = 0.0   widths = [-1 for _i in xrange(model.columnCount(QModelIndex()))] + + key = '%s/column_widths/%s' % (self.cfgname, str(self.repo[0])) + col_widths = [int(w) for w in QSettings().value(key).toStringList()] +   for c in range(model.columnCount(QModelIndex())): - if model._columns[c] in model._stretchs: - tot_stretch += model._stretchs[model._columns[c]] - continue - w = model.maxWidthValueForColumn(c) + if c < len(col_widths) and col_widths[c] > 0: + w = col_widths[c] + else: + w = model.maxWidthValueForColumn(c) +   if isinstance(w, int):   widths[c] = w   elif w is not None: @@ -138,12 +139,7 @@
  else:   w = super(HgRepoView, self).sizeHintForColumn(c)   widths[c] = w - col1_width -= widths[c] - col1_width = max(col1_width, 100) - for c in range(model.columnCount(QModelIndex())): - if model._columns[c] in model._stretchs: - w = model._stretchs[model._columns[c]] / tot_stretch - widths[c] = col1_width * w +   return widths     def revFromindex(self, index): @@ -237,3 +233,43 @@
  idx = self.model().indexFromRev(rev)   if idx is not None:   self.setCurrentIndex(idx) + + def saveSettings(self, s = None): + if not s: + s = QSettings() + + col_widths = [] + for c in range(self.model().columnCount(QModelIndex())): + col_widths.append(self.columnWidth(c)) + + key = '%s/column_widths/%s' % (self.cfgname, str(self.repo[0])) + s.setValue(key, col_widths) + s.setValue('%s/widget_width' % self.cfgname, self.viewport().width()) + + def resizeEvent(self, e): + # re-size columns the smart way: the column holding Description + # is re-sized according to the total widget size. + key = '%s/widget_width' % self.cfgname + widget_width, ok = QSettings().value(key).toInt() + if not ok: + widget_width = 0 + + if self.resized: + model = self.model() + vp_width = self.viewport().width() + total_width = stretch_col = 0 + + if vp_width != widget_width: + for c in range(model.columnCount(QModelIndex())): + if model._columns[c] in model._stretchs: + #save the description column + stretch_col = c + else: + #total the other widths + total_width += self.columnWidth(c) + + width = max(vp_width - total_width, 100) + self.setColumnWidth(stretch_col, width) + + super(HgRepoView, self).resizeEvent(e) +
 
123
124
125
126
 
127
128
129
 
673
674
675
 
676
677
678
 
795
796
797
 
798
799
800
 
954
955
956
957
 
958
959
960
 
1051
1052
1053
1054
 
1055
1056
 
1057
1058
1059
 
1126
1127
1128
1129
 
1130
1131
1132
 
1156
1157
1158
1159
 
 
 
 
 
 
1160
1161
1162
 
123
124
125
 
126
127
128
129
 
673
674
675
676
677
678
679
 
796
797
798
799
800
801
802
 
956
957
958
 
959
960
961
962
 
1053
1054
1055
 
1056
1057
 
1058
1059
1060
1061
 
1128
1129
1130
 
1131
1132
1133
1134
 
1158
1159
1160
 
1161
1162
1163
1164
1165
1166
1167
1168
1169
@@ -123,7 +123,7 @@
    self.layout().addWidget(self.repotabs_splitter)   - self.repoview = view = HgRepoView(self.repo, self) + self.repoview = view = HgRepoView(self.repo, 'repoWidget', self)   view.revisionClicked.connect(self.onRevisionClicked)   view.revisionSelected.connect(self.onRevisionSelected)   view.revisionAltClicked.connect(self.onRevisionSelected) @@ -673,6 +673,7 @@
    self.setupModels()   self.filterbar.refresh() + self.repoview.saveSettings()     def reloadTaskTab(self):   tti = self.taskTabsWidget.currentIndex() @@ -795,6 +796,7 @@
  self.manifestDemand.forward('saveSettings', s, 'workbench')   self.grepDemand.forward('saveSettings', s)   self.filterbar.saveSettings(s) + self.repoview.saveSettings(s)   return True     def incoming(self): @@ -954,7 +956,7 @@
  entry(menu)     submenu = menu.addMenu(_('Export')) - entry(submenu, None, isrev, _('Export patch'), 'hg-export', + entry(submenu, None, isrev, _('Export patch...'), 'hg-export',   self.exportRevisions)   entry(submenu, None, isrev, _('Email patch...'), 'mail-forward',   self.emailRevision) @@ -1051,9 +1053,9 @@
  menu = QMenu(self)   for name, cb, icon in (   (_('Visual Diff...'), diffPair, 'visualdiff'), - (_('Export Selected'), exportPair, 'hg-export'), + (_('Export Selected...'), exportPair, 'hg-export'),   (_('Email Selected...'), emailPair, 'mail-forward'), - (_('Export DAG Range'), exportDagRange, 'hg-export'), + (_('Export DAG Range...'), exportDagRange, 'hg-export'),   (_('Email DAG Range...'), emailDagRange, 'mail-forward'),   (_('Bisect - Good, Bad...'), bisectNormal, 'hg-bisect-good-bad'),   (_('Bisect - Bad, Good...'), bisectReverse, 'hg-bisect-bad-good'), @@ -1126,7 +1128,7 @@
  run.email(self.repo.ui, rev=self.menuselection, repo=self.repo)   menu = QMenu(self)   for name, cb, icon in ( - (_('Export Selected'), exportSel, 'hg-export'), + (_('Export Selected...'), exportSel, 'hg-export'),   (_('Email Selected...'), emailSel, 'mail-forward'),   ):   a = QAction(name, self) @@ -1156,7 +1158,12 @@
  def exportRevisions(self, revisions):   if not revisions:   revisions = [self.rev] - epath = os.path.join(self.repo.root, self.repo.shortname + '_%r.patch') + dir = QFileDialog.getExistingDirectory(self, _('Export patch'), + hglib.tounicode(self.repo.root)) + if not dir: + return + epath = os.path.join(hglib.fromunicode(dir), + self.repo.shortname + '_%r.patch')   cmdline = ['export', '--repository', self.repo.root, '--verbose',   '--output', epath]   for rev in revisions:
 
649
650
651
652
 
 
653
654
655
656
657
658
 
 
659
660
 
661
662
 
663
664
665
 
672
673
674
675
 
676
677
 
678
679
 
680
681
682
683
684
685
 
686
687
688
 
689
690
 
691
692
693
 
704
705
706
707
 
708
709
710
 
718
719
720
721
 
 
722
723
724
725
726
727
728
 
729
730
 
731
732
 
733
734
735
 
784
785
786
 
787
788
789
790
 
791
792
 
793
794
795
 
796
797
798
 
799
800
 
801
802
803
 
1037
1038
1039
1040
1041
 
 
 
 
 
 
 
1042
1043
1044
 
649
650
651
 
652
653
654
655
656
657
 
 
658
659
660
 
661
662
 
663
664
665
666
 
673
674
675
 
676
677
 
678
679
 
680
681
682
683
684
685
686
687
688
689
 
690
691
 
692
693
694
695
 
706
707
708
 
709
710
711
712
 
720
721
722
 
723
724
725
726
727
728
729
730
 
731
732
 
733
734
 
735
736
737
738
 
787
788
789
790
791
792
793
 
794
795
 
796
797
798
 
799
800
801
 
802
803
 
804
805
806
807
 
1041
1042
1043
 
 
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
@@ -649,17 +649,18 @@
    def inclicked(self):   url = self.currentUrl(True) - self.showMessage.emit(_('Getting incoming changesets from %s...') % url) + urlu = hglib.tounicode(url) + self.showMessage.emit(_('Getting incoming changesets from %s...') % urlu)   if self.embedded and not url.startswith('p4://') and \   not self.opts.get('subrepos'):   def finished(ret, output):   if ret == 0 and os.path.exists(bfile): - self.showMessage.emit(_('Found incoming changesets from %s') % url) - self.incomingBundle.emit(bfile) + self.showMessage.emit(_('Found incoming changesets from %s') % urlu) + self.incomingBundle.emit(hglib.tounicode(bfile))   elif ret == 1: - self.showMessage.emit(_('No incoming changesets from %s') % url) + self.showMessage.emit(_('No incoming changesets from %s') % urlu)   else: - self.showMessage.emit(_('Incoming from %s aborted, ret %d') % (url, ret)) + self.showMessage.emit(_('Incoming from %s aborted, ret %d') % (urlu, ret))   bfile = url   for badchar in (':', '*', '\\', '?', '#'):   bfile = bfile.replace(badchar, '') @@ -672,22 +673,23 @@
  else:   def finished(ret, output):   if ret == 0: - self.showMessage.emit(_('Found incoming changesets from %s') % url) + self.showMessage.emit(_('Found incoming changesets from %s') % urlu)   elif ret == 1: - self.showMessage.emit(_('No incoming changesets from %s') % url) + self.showMessage.emit(_('No incoming changesets from %s') % urlu)   else: - self.showMessage.emit(_('Incoming from %s aborted, ret %d') % (url, ret)) + self.showMessage.emit(_('Incoming from %s aborted, ret %d') % (urlu, ret))   self.finishfunc = finished   cmdline = ['--repository', self.repo.root, 'incoming']   self.run(cmdline, ('force', 'branch', 'rev', 'subrepos'))     def pullclicked(self):   url = self.currentUrl(True) + urlu = hglib.tounicode(url)   def finished(ret, output):   if ret == 0: - self.showMessage.emit(_('Pull from %s completed') % url) + self.showMessage.emit(_('Pull from %s completed') % urlu)   else: - self.showMessage.emit(_('Pull from %s aborted, ret %d') % (url, ret)) + self.showMessage.emit(_('Pull from %s aborted, ret %d') % (urlu, ret))   # handle file conflicts during rebase   if os.path.exists(self.repo.join('rebasestate')):   dlg = rebase.RebaseDialog(self.repo, self) @@ -704,7 +706,7 @@
  dlg.exec_()   return   self.finishfunc = finished - self.showMessage.emit(_('Pulling from %s...') % url) + self.showMessage.emit(_('Pulling from %s...') % urlu)   cmdline = ['--repository', self.repo.root, 'pull', '--verbose']   uimerge = self.repo.ui.configbool('tortoisehg', 'autoresolve') \   and 'ui.merge=internal:merge' or 'ui.merge=internal:fail' @@ -718,18 +720,19 @@
    def outclicked(self):   url = self.currentUrl(True) - self.showMessage.emit(_('Finding outgoing changesets to %s...') % url) + urlu = hglib.tounicode(url) + self.showMessage.emit(_('Finding outgoing changesets to %s...') % urlu)   if self.embedded and not self.opts.get('subrepos'):   def outputnodes(ret, data):   if ret == 0:   nodes = [n for n in data.splitlines() if len(n) == 40]   self.outgoingNodes.emit(nodes)   self.showMessage.emit(_('%d outgoing changesets to %s') % - (len(nodes), url)) + (len(nodes), urlu))   elif ret == 1: - self.showMessage.emit(_('No outgoing changesets to %s') % url) + self.showMessage.emit(_('No outgoing changesets to %s') % urlu)   else: - self.showMessage.emit(_('Outgoing to %s aborted, ret %d') % (url, ret)) + self.showMessage.emit(_('Outgoing to %s aborted, ret %d') % (urlu, ret))   self.finishfunc = outputnodes   cmdline = ['--repository', self.repo.root, 'outgoing', '--quiet',   '--template', '{node}\n'] @@ -784,20 +787,21 @@
    def pushclicked(self):   url = self.currentUrl(True) + urlu = hglib.tounicode(url)   if not hg.islocal(self.currentUrl(False)):   r = qtlib.QuestionMsgBox(_('Confirm Push to remote Repository'),   _('Push to remote repository\n%s\n?') - % url) + % urlu)   if not r: - self.showMessage.emit(_('Push to %s aborted') % url) + self.showMessage.emit(_('Push to %s aborted') % urlu)   return   - self.showMessage.emit(_('Pushing to %s...') % url) + self.showMessage.emit(_('Pushing to %s...') % urlu)   def finished(ret, output):   if ret == 0: - self.showMessage.emit(_('Push to %s completed') % url) + self.showMessage.emit(_('Push to %s completed') % urlu)   else: - self.showMessage.emit(_('Push to %s aborted, ret %d') % (url, ret)) + self.showMessage.emit(_('Push to %s aborted, ret %d') % (urlu, ret))   self.finishfunc = finished   cmdline = ['--repository', self.repo.root, 'push']   self.run(cmdline, ('force', 'new-branch', 'branch', 'rev')) @@ -1037,8 +1041,13 @@
  super(SecureDialog, self).__init__(parent)     def genfingerprint(): - pem = ssl.get_server_certificate( (host, 443) ) - der = ssl.PEM_cert_to_DER_cert(pem) + try: + pem = ssl.get_server_certificate( (host, 443) ) + der = ssl.PEM_cert_to_DER_cert(pem) + except Exception, e: + qtlib.WarningMsgBox(_('Certificate Query Error'), + hglib.tounicode(str(e)), parent=self) + return   hash = util.sha1(der).hexdigest()   pretty = ":".join([hash[x:x + 2] for x in xrange(0, len(hash), 2)])   le.setText(pretty)
 
5
6
7
8
9
10
11
12
 
13
14
 
15
16
17
 
255
256
257
258
259
260
 
 
261
262
263
 
306
307
308
309
310
311
 
 
312
313
314
 
322
323
324
 
 
 
 
 
325
326
327
 
5
6
7
 
 
 
 
 
8
9
 
10
11
12
13
 
251
252
253
 
 
 
254
255
256
257
258
 
301
302
303
 
 
 
304
305
306
307
308
 
316
317
318
319
320
321
322
323
324
325
326
@@ -5,13 +5,9 @@
 # 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 - -from mercurial import error, util - -from tortoisehg.util import hglib, i18n +from tortoisehg.util import hglib  from tortoisehg.hgqt.i18n import _ -from tortoisehg.hgqt import qtlib, cmdui +from tortoisehg.hgqt import qtlib, cmdui, i18n    from PyQt4.QtCore import *  from PyQt4.QtGui import * @@ -255,9 +251,8 @@
  ctx = self.repo[self.rev]   msgset = keep._('Added tag %s for changeset %s')   message = (english and msgset['id'] or msgset['str']) \ - % (tag, str(ctx)) - if not isinstance(message, str): - message = hglib.fromunicode(message) + % (tagu, str(ctx)) + message = hglib.fromunicode(message)     def finished():   if exists: @@ -306,9 +301,8 @@
  return   if not message:   msgset = keep._('Removed tag %s') - message = (english and msgset['id'] or msgset['str']) % tag - if not isinstance(message, str): - message = hglib.fromunicode(message) + message = (english and msgset['id'] or msgset['str']) % tagu + message = hglib.fromunicode(message)     def finished():   self.set_status(_("Tag '%s' has been removed") % tagu, True) @@ -322,6 +316,11 @@
  self.finishfunc = finished   self.cmd.run(cmd)   + def reject(self): + # prevent signals from reaching deleted objects + self.repo.repositoryChanged.disconnect(self.refresh) + super(BookmarkDialog, self).reject() +  def run(ui, *pats, **opts):   kargs = {}   tag = len(pats) > 0 and pats[0] or None
 
288
289
290
291
 
292
293
294
 
358
359
360
361
362
363
364
 
378
379
380
 
381
382
 
 
383
384
 
385
386
387
 
397
398
399
 
400
401
402
 
403
404
405
 
411
412
413
414
415
416
417
418
419
420
 
 
 
421
422
423
 
440
441
442
443
444
445
 
446
447
 
 
 
 
448
449
450
 
463
464
465
466
 
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
 
 
 
 
 
483
484
485
 
 
 
 
486
487
488
 
494
495
496
497
 
498
499
500
 
501
502
503
 
509
510
511
 
 
 
 
 
 
 
 
 
 
 
512
513
514
 
288
289
290
 
291
292
293
294
 
358
359
360
 
361
362
363
 
377
378
379
380
381
 
382
383
384
 
385
386
387
388
 
398
399
400
401
402
403
 
404
405
406
407
 
413
414
415
 
 
416
 
 
 
 
417
418
419
420
421
422
 
439
440
441
 
442
 
443
444
 
445
446
447
448
449
450
451
 
464
465
466
 
467
468
469
470
471
472
473
 
 
 
 
 
 
 
 
 
 
474
475
476
477
478
479
 
 
480
481
482
483
484
485
486
 
492
493
494
 
495
496
497
 
498
499
500
501
 
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
@@ -288,7 +288,7 @@
    # If more than one file, diff on working dir copy.   copyworkingdir = len(MAR) > 1 - dirs, labels, fns_and_mtimes = snapshotset(repo, ctxs, sa, sb, cpy, + dirs, labels, fns_and_mtimes = snapshotset(repo, ctxs, sa, sb, cpy,   copyworkingdir)   dir1a, dir1b, dir2 = dirs   label1a, label1b, label2 = labels @@ -358,7 +358,6 @@
  def __init__(self, repo, pats, ctx1a, sa, ctx1b, sb, ctx2, cpy):   'Initialize the Dialog'   QDialog.__init__(self) - self.curFile = None     self.setWindowIcon(qtlib.geticon('visualdiff'))   @@ -378,10 +377,12 @@
  self.reponame = hglib.fromunicode(repo.displayname)     self.ctxs = (ctx1a, ctx1b, ctx2) + self.filesets = (sa, sb)   self.copies = cpy - self.ui = repo.ui + self.repo = repo + self.curFile = None   - layout = QVBoxLayout() + layout = QVBoxLayout()   self.setLayout(layout)     lbl = QLabel(_('Temporary files are removed when this dialog' @@ -397,9 +398,10 @@
  preferred = besttool(repo.ui, tools)   self.diffpath, self.diffopts, self.mergeopts = tools[preferred]   self.tools = tools + self.preferred = preferred     if len(tools) > 1: - hbox = QHBoxLayout() + hbox = QHBoxLayout()   combo = QComboBox()   lbl = QLabel(_('Select Tool:'))   lbl.setBuddy(combo) @@ -411,13 +413,10 @@
  if name == preferred:   defrow = i   combo.setCurrentIndex(defrow) - patterns = repo.ui.configitems('diff-patterns') - patterns = [(p, t) for p,t in patterns if t in tools]   - callable = lambda row: self.fileSelect(row, repo, combo, - patterns, preferred) - list.currentRowChanged.connect(callable) - combo.currentIndexChanged['QString'].connect(self.toolSelect) + list.currentRowChanged.connect(self.updateToolSelection) + combo.currentIndexChanged['QString'].connect(self.onToolSelected) + self.toolCombo = combo     BB = QDialogButtonBox   bb = BB() @@ -440,11 +439,13 @@
    self.updateDiffButtons(preferred)   - callable = lambda: self.fillmodel(repo, sa, sb)   QShortcut(QKeySequence('CTRL+D'), self.list, self.activateCurrent) - QTimer.singleShot(0, callable) + QTimer.singleShot(0, self.fillmodel)   - def fillmodel(self, repo, sa, sb): + @pyqtSlot() + def fillmodel(self): + repo = self.repo + sa, sb = self.filesets   self.dirs, self.revs = snapshotset(repo, self.ctxs, sa, sb, self.copies)[:2]     def get_status(file, mod, add, rem): @@ -463,26 +464,23 @@
  self.list.addItem(row)     @pyqtSlot(QString) - def toolSelect(self, tool): + def onToolSelected(self, tool):   'user selected a tool from the tool combo'   tool = hglib.fromunicode(tool)   assert tool in self.tools   self.diffpath, self.diffopts, self.mergeopts = self.tools[tool]   self.updateDiffButtons(tool)   - def updateDiffButtons(self, tool): - if hasattr(self, 'p1button'): - d2 = self.ui.configbool('merge-tools', tool + '.dirdiff') - d3 = self.ui.configbool('merge-tools', tool + '.dir3diff') - self.p1button.setEnabled(d2) - self.p2button.setEnabled(d2) - self.p3button.setEnabled(d3) - elif hasattr(self, 'dbutton'): - d2 = self.ui.configbool('merge-tools', tool + '.dirdiff') - self.dbutton.setEnabled(d2) + @pyqtSlot(int) + def updateToolSelection(self, row): + 'user selected a file, pick an appropriate tool from combo' + if row == -1: + return   - def fileSelect(self, row, repo, combo, patterns, preferred): - 'user selected a file, pick an appropriate tool from combo' + repo = self.repo + patterns = repo.ui.configitems('diff-patterns') + patterns = [(p, t) for p,t in patterns if t in tools] +   fname = self.list.item(row).text()[2:]   fname = hglib.fromunicode(fname)   if self.curFile == fname: @@ -494,10 +492,10 @@
  selected = tool   break   else: - selected = preferred + selected = self.preferred   for i, name in enumerate(self.tools.iterkeys()):   if name == selected: - combo.setCurrentIndex(i) + self.toolCombo.setCurrentIndex(i)     def activateCurrent(self):   'CTRL+D has been pressed' @@ -509,6 +507,17 @@
  'A QListWidgetItem has been activated'   self.launch(item.text()[2:])   + def updateDiffButtons(self, tool): + if hasattr(self, 'p1button'): + d2 = self.repo.ui.configbool('merge-tools', tool + '.dirdiff') + d3 = self.repo.ui.configbool('merge-tools', tool + '.dir3diff') + self.p1button.setEnabled(d2) + self.p2button.setEnabled(d2) + self.p3button.setEnabled(d3) + elif hasattr(self, 'dbutton'): + d2 = self.repo.ui.configbool('merge-tools', tool + '.dirdiff') + self.dbutton.setEnabled(d2) +   def launch(self, fname):   fname = hglib.fromunicode(fname)   source = self.copies.get(fname, None)
Change 1 of 1 Show Entire File win32/​hg.cmd Stacked
 
1
2
3
 
 
 
 
@@ -1,3 +0,0 @@
-@echo off -rem launch hg.exe from parent folder -"%~dp0\..\hg.exe" %*
Change 1 of 1 Show Entire File win32/​thg.cmd Stacked
 
1
2
3
 
 
 
 
@@ -1,3 +0,0 @@
-@echo off -rem launch thg.exe from parent folder -"%~dp0\..\thg.exe" %*
 
67
68
69
70
71
72
73
 
 
74
75
76
 
67
68
69
 
 
 
 
70
71
72
73
74
@@ -67,10 +67,8 @@
  <?define docdiffEXE.guid = {F4A6629F-85C1-406E-8262-C02E8DBDB4FA} ?>   <?define KDiff3EXE.guid = {075ECC11-1B44-48DB-B7FD-D3207BB801A4} ?>   - <?define TortoisePlinkEXE.guid = {7679909C-7390-4546-9FCA-A5A31520DA50} ?> - <?define PageantEXE.guid = {228F24A3-FA1C-4439-BCB4-71DF790E61DC} ?> - <?define thgcmd.guid = {7B660ED7-CAEA-4851-8ABD-751251842457} ?> - <?define hgcmd.guid = {4A986763-BD4D-46DC-89CD-A36F037D847E} ?> + <?define TortoisePlinkEXE.guid = {E983CBBB-BD4E-4698-BE6F-CECB80D5BA76} ?> + <?define PageantEXE.guid = {91F28A55-874F-4957-A288-BB0F24E419A4} ?>     <?define chmFile.guid = {422C758A-6CB2-4531-BE6A-366B3CD1FD8D} ?>   <?define pdfFile.guid = {A0EC2473-996A-4DBC-9F44-76B63B57AE31} ?>
 
93
94
95
96
 
97
98
99
 
197
198
199
 
 
 
 
 
 
 
 
 
 
 
200
201
202
 
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
 
385
386
387
388
389
390
391
392
 
93
94
95
 
96
97
98
99
 
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
 
250
251
252
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
253
254
255
 
373
374
375
 
 
376
377
378
@@ -93,7 +93,7 @@
  Source='dist\thg.exe'   />   <Environment Id="Environment" Name="PATH" Part="last" System="yes" - Permanent="no" Value="[INSTALLDIR]bin" Action="set" + Permanent="no" Value="[INSTALLDIR]" Action="set"   />   </Component>   <Component Id='WinExecutable' Guid='$(var.ComponentWinExecutableGUID)' Win64='$(var.IsX64)'> @@ -197,6 +197,17 @@
  />   </Component>   + <Component Id='TortoisePlinkEXE' Guid='$(var.TortoisePlinkEXE.guid)' Win64='$(var.IsX64)'> + <File Id='TortoisePlinkEXE' Name='TortoisePlink.exe' KeyPath='yes' + Source='..\contrib\TortoisePlink.exe' + /> + </Component> + <Component Id='PageantEXE' Guid='$(var.PageantEXE.guid)' Win64='$(var.IsX64)'> + <File Id='PageantEXE' Name='Pageant.exe' KeyPath='yes' + Source='..\contrib\Pageant.exe' + /> + </Component> +   <?if $(var.Platform) = "x64" ?>   <Component Id='KDiff3EXE' Guid='$(var.KDiff3EXE.guid)' Win64='$(var.IsX64)'>   <File Id='KDiff3EXE' Name='kdiff3.exe' KeyPath='yes' @@ -239,29 +250,6 @@
  </Component>   </Directory>   - <Directory Id='binFolder' Name='bin'> - <Component Id='TortoisePlinkEXE' Guid='$(var.TortoisePlinkEXE.guid)' Win64='$(var.IsX64)'> - <File Id='TortoisePlinkEXE' Name='TortoisePlink.exe' KeyPath='yes' - Source='..\contrib\TortoisePlink.exe' - /> - </Component> - <Component Id='PageantEXE' Guid='$(var.PageantEXE.guid)' Win64='$(var.IsX64)'> - <File Id='PageantEXE' Name='Pageant.exe' KeyPath='yes' - Source='..\contrib\Pageant.exe' - /> - </Component> - <Component Id='ThgCmd' Guid='$(var.thgcmd.guid)' Win64='$(var.IsX64)'> - <File Id='Thg.Cmd' Name='thg.cmd' KeyPath='yes' - Source='win32\thg.cmd' - /> - </Component> - <Component Id='HgCmd' Guid='$(var.hgcmd.guid)' Win64='$(var.IsX64)'> - <File Id='Hg.Cmd' Name='hg.cmd' KeyPath='yes' - Source='win32\hg.cmd' - /> - </Component> - </Directory> -   <Directory Id='HGRCD' Name='hgrc.d'>   <Component Id='mercurial.rc' Guid='$(var.mercurial.rc.guid)' Win64='$(var.IsX64)'>   <File Id='mercurial.rc' Name='Mercurial.rc' ReadOnly='yes' @@ -385,8 +373,6 @@
  <ComponentRef Id='helpFolder' />   <ComponentRef Id='distOutput' />   <ComponentRef Id='imageFormats' /> - <ComponentRef Id='ThgCmd' /> - <ComponentRef Id='HgCmd' />   <ComponentGroupRef Id='templatesFolder' />   <ComponentRef Id='Icons' />   </Feature>