Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph

Merge with stable

Changeset c25b4666832b

Parents df80bd602a1f

Parents 400d31672119

by Steve Borho

Changes to 38 files · Browse files at c25b4666832b Showing diff from parent df80bd602a1f 400d31672119 Diff from another changeset...

Change 1 of 1 Show Entire File .hgtags Stacked
 
58
59
60
 
 
58
59
60
61
@@ -58,3 +58,4 @@
 f2165388e6870c643636a0a74f1ebd1d008bdf3e 2.0.5  2a970d5e40fe4f757347464d820218809d58251b 2.1  65a385cf4238af969487dc1a7a2b5ee60cf388cc 2.1.1 +d9e84b581ef3961a12fe695a566ffafb9944920e 2.1.2
Show Entire File i18n/​tortoisehg/​ca.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​cs.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​da.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​de.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​en_AU.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​en_GB.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​es.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​et.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​fa.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​fr.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​he.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​hr.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​hu.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​it.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​ja.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​ko.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​nb.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​nl.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​nn.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​oc.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​pl.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​pt.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​pt_BR.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​ru.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​sr.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​sv.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​tr.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​uk.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​zh_CN.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File i18n/​tortoisehg/​zh_TW.po Stacked
This file's diff was not loaded because this changeset is very large. Load changes
 
396
397
398
399
 
400
401
402
 
 
403
404
405
 
408
409
410
411
 
412
413
414
 
497
498
499
500
 
 
501
502
503
 
396
397
398
 
399
400
 
 
401
402
403
404
405
 
408
409
410
 
411
412
413
414
 
497
498
499
 
500
501
502
503
504
@@ -396,10 +396,10 @@
  fullmsg = ''   def write(self, msg, *args, **opts):   self.fullmsg += msg - if self.fullmsg.endswith('\0'): + if self.fullmsg.count('\0') >= 6:   try: - fname, line, rev, addremove, user, text = \ - self.fullmsg.split('\0', 5) + fname, line, rev, addremove, user, text, tail = \ + self.fullmsg.split('\0', 6)   text = hglib.tounicode(text)   text = Qt.escape(text)   text = '<b>%s</b> <span>%s</span>' % ( @@ -408,7 +408,7 @@
  emitrow(row)   except ValueError:   pass - self.fullmsg = '' + self.fullmsg = tail   def progress(topic, pos, item='', unit='', total=None):   emitprog(topic, pos, item, unit, total)   cwd = os.getcwd() @@ -497,7 +497,8 @@
  if pos:   self.hu.write(line[pos:], label='ui.status')   path = os.path.join(prefix, wfile) - row = [path, i + 1, ctx.rev(), None, self.hu.getdata()[0]] + row = [path, i + 1, ctx.rev(), None, + hglib.tounicode(self.hu.getdata()[0])]   w = DataWrapper(row)   self.matchedRow.emit(w)   if self.once:
 
5
6
7
8
 
9
10
11
12
13
14
 
43
44
45
46
47
 
48
49
50
 
5
6
7
 
8
9
10
 
11
12
13
 
42
43
44
 
 
45
46
47
48
@@ -5,10 +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, time +import os, cgi, time    from mercurial import ui -from PyQt4 import QtCore  from tortoisehg.hgqt import qtlib  from tortoisehg.util import hglib   @@ -43,8 +42,7 @@
    def style(self, msg, label):   'Escape message for safe HTML, then apply specified style' - msg = QtCore.Qt.escape(msg) - msg = msg.replace('\n', '<br />') + msg = cgi.escape(msg).replace('\n', '<br />')   style = qtlib.geteffect(label)   return '<span style="%s">%s</span>' % (style, msg)  
 
779
780
781
782
783
 
 
784
785
786
 
794
795
796
797
 
798
799
 
800
801
802
 
805
806
807
808
 
809
810
 
811
812
813
 
822
823
824
 
 
825
826
827
 
779
780
781
 
 
782
783
784
785
786
 
794
795
796
 
797
798
 
799
800
801
802
 
805
806
807
 
808
809
 
810
811
812
813
 
822
823
824
825
826
827
828
829
@@ -779,8 +779,8 @@
  self._closebutton.clicked.connect(self.close)   self.layout().addWidget(self._closebutton)   - def addWidget(self, w): - self.layout().insertWidget(self.layout().count() - 2, w) + def addWidget(self, w, stretch=0): + self.layout().insertWidget(self.layout().count() - 2, w, stretch)     def addRightWidget(self, w):   self.layout().insertWidget(self.layout().count() - 1, w) @@ -794,9 +794,9 @@
  """Show status message"""   def __init__(self, message, parent=None):   super(StatusInfoBar, self).__init__(parent) - self._msglabel = QLabel(message, self, + self._msglabel = QLabel(message, self, wordWrap=True,   textInteractionFlags=Qt.TextSelectableByMouse) - self.addWidget(self._msglabel) + self.addWidget(self._msglabel, stretch=1)    class CommandErrorInfoBar(InfoBar):   """Show command execution failure (with link to open log window)""" @@ -805,9 +805,9 @@
  def __init__(self, message, parent=None):   super(CommandErrorInfoBar, self).__init__(parent)   - self._msglabel = QLabel(message, self, + self._msglabel = QLabel(message, self, wordWrap=True,   textInteractionFlags=Qt.TextSelectableByMouse) - self.addWidget(self._msglabel) + self.addWidget(self._msglabel, stretch=1)     self._loglabel = QLabel('<a href="log:">%s</a>' % _('Show Log'))   self._loglabel.linkActivated.connect(self.linkActivated) @@ -822,6 +822,8 @@
  def __init__(self, message, parent=None):   super(ConfirmInfoBar, self).__init__(parent)   + # no wordWrap=True and stretch=1, which inserts unwanted space + # between _msglabel and _buttons.   self._msglabel = QLabel(message, self,   textInteractionFlags=Qt.TextSelectableByMouse)   self.addWidget(self._msglabel)
 
279
280
281
282
283
284
285
 
279
280
281
 
282
283
284
@@ -279,7 +279,6 @@
  else:   idx = self.model().indexFromRev(rev)   if idx is not None: - self.setCurrentIndex(idx)   self.scrollTo(idx)     def saveSettings(self, s = None):
 
493
494
495
 
 
 
 
496
497
498
 
493
494
495
496
497
498
499
500
501
502
@@ -493,6 +493,10 @@
  'Default: 0, Not expanded')),   _fi(_('Force Repo Tab'), 'tortoisehg.forcerepotab', genBoolRBGroup,   _('Always show repo tabs, even for a single repo. Default: False')), + _fi(_('Monitor Repo Changes'), 'tortoisehg.monitorrepo', + (genDefaultCombo, ['always', 'localonly']), + _('Specify the target filesystem where TortoiseHg monitors changes. ' + 'Default: always')),   _fi(_('Max Diff Size'), 'tortoisehg.maxdiff', genIntEditCombo,   _('The maximum size file (in KB) that TortoiseHg will '   'show changes for in the changelog, status, and commit windows. '
 
21
22
23
24
 
25
26
27
 
80
81
82
 
 
83
84
 
 
85
86
87
 
21
22
23
 
24
25
26
27
 
80
81
82
83
84
85
86
87
88
89
90
91
@@ -21,7 +21,7 @@
 from mercurial import ui as uimod  from mercurial.util import propertycache   -from tortoisehg.util import hglib +from tortoisehg.util import hglib, paths  from tortoisehg.util.patchctx import patchctx    _repocache = {} @@ -80,8 +80,12 @@
  repo.workingDirectoryChanged = self.workingDirectoryChanged   repo.workingBranchChanged = self.workingBranchChanged   self.recordState() + + monitorrepo = repo.ui.config('tortoisehg', 'monitorrepo', 'always')   if isinstance(repo, bundlerepo.bundlerepository):   dbgoutput('not watching F/S events for bundle repository') + elif monitorrepo == 'localonly' and paths.netdrive_status(repo.path): + dbgoutput('not watching F/S events for network drive')   else:   self.watcher = QFileSystemWatcher(self)   self.watcher.addPath(repo.path)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
100
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
99
100
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
 # paths.py - TortoiseHg path utilities  #  # Copyright 2009 Steve Borho <steve@borho.org>  #  # This software may be used and distributed according to the terms of the  # GNU General Public License version 2, incorporated herein by reference.    try:   from config import icon_path, bin_path, license_path, locale_path  except ImportError:   icon_path, bin_path, license_path, locale_path = None, None, None, None    import os, sys    def find_root(path=None):   p = path or os.getcwd()   while not os.path.isdir(os.path.join(p, ".hg")):   oldp = p   p = os.path.dirname(p)   if p == oldp:   return None   if not os.access(p, os.R_OK):   return None   return p    def get_tortoise_icon(icon):   "Find a tortoisehg icon"   icopath = os.path.join(get_icon_path(), icon)   if os.path.isfile(icopath):   return icopath   else:   print 'icon not found', icon   return None    def get_icon_path():   global icon_path   return icon_path or os.path.join(get_prog_root(), 'icons')    def get_license_path():   global license_path   return license_path or os.path.join(get_prog_root(), 'COPYING.txt')    def get_locale_path():   global locale_path   return locale_path or os.path.join(get_prog_root(), 'locale')    if os.name == 'nt':   import _winreg   import win32net   import win32api   import win32file     def find_in_path(pgmname):   "return first executable found in search path"   global bin_path   ospath = os.environ['PATH'].split(os.pathsep)   ospath.insert(0, bin_path or get_prog_root())   pathext = os.environ.get('PATHEXT', '.COM;.EXE;.BAT;.CMD')   pathext = pathext.lower().split(os.pathsep)   for path in ospath:   ppath = os.path.join(path, pgmname)   for ext in pathext:   if os.path.exists(ppath + ext):   return ppath + ext   return None     def get_prog_root():   if getattr(sys, 'frozen', False):   try:   return _winreg.QueryValue(_winreg.HKEY_LOCAL_MACHINE,   r"Software\TortoiseHg")   except:   pass   return os.path.dirname(os.path.dirname(os.path.dirname(__file__)))     def is_on_fixed_drive(path):   if hasattr(os.path, 'splitunc'):   unc, rest = os.path.splitunc(path)   if unc:   # All UNC paths (\\host\mount) are considered not-fixed   return False   drive, remain = os.path.splitdrive(path)   if drive:   return win32file.GetDriveType(drive) == win32file.DRIVE_FIXED   else:   return False     USE_OK = 0 # network drive status     def netdrive_status(drive):   """   return True if a network drive is accessible (connected, ...),   or False if <drive> is not a network drive   """   if hasattr(os.path, 'splitunc'):   unc, rest = os.path.splitunc(drive)   if unc: # All UNC paths (\\host\mount) are considered nonlocal   return True - letter = os.path.splitdrive(drive)[0] + letter = os.path.splitdrive(drive)[0].upper()   _drives, total, _ = win32net.NetUseEnum(None, 1, 0)   for drv in _drives:   if drv['local'] == letter:   info = win32net.NetUseGetInfo(None, letter, 1)   return info['status'] == USE_OK   return False    else: # Not Windows     def find_in_path(pgmname):   """ return first executable found in search path """   global bin_path   ospath = os.environ['PATH'].split(os.pathsep)   ospath.insert(0, bin_path or get_prog_root())   for path in ospath:   ppath = os.path.join(path, pgmname)   if os.access(ppath, os.X_OK):   return ppath   return None     def get_prog_root():   path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))   return path     def netdrive_status(drive):   """   return True if a network drive is accessible (connected, ...),   or False if <drive> is not a network drive   """   return False     def is_on_fixed_drive(path):   return True