Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.0, 1.0.1, and 1.0.2

Merge with stable

Changeset de0251c7291e

Parents 355f22331d2e

Parents fbf42262c763

by Steve Borho

Changes to 102 files · Browse files at de0251c7291e Showing diff from parent 355f22331d2e fbf42262c763 Diff from another changeset...

Change 1 of 1 Show Entire File CONTRIBUTING.txt Stacked
 
15
16
17
 
 
 
 
 
 
15
16
17
18
19
20
21
22
@@ -15,3 +15,8 @@
 below.    PyGtk: 2.10 + +=== Python version === + +TortoiseHg needs to run on Python 2.4, to stay consistent with Mercurial +itself.
Change 1 of 1 Show Entire File INSTALL.txt Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
@@ -0,0 +1,25 @@
+** Please do not run setup.py ** + +On Linux, the suggested methods for using TortoiseHg are to either +install a package built for your distribution, or run directly out of a +cloned repository. For details, see: + +http://bitbucket.org/tortoisehg/stable/wiki/download + +http://bitbucket.org/tortoisehg/stable/wiki/hgtk + +http://bitbucket.org/tortoisehg/stable/wiki/nautilus + + +On Windows, we prefer you use the more recent stable release, which +can always be found at http://tortoisehg.org + + +If you ran setup.py and are now having troubles with icons, you have two +choices: + +1) Find the tortoisehg/util/config.py file that was installed and +manually edit it to fixup the paths. + +2) Delete the installation and use one of the preferred install methods. +
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
 
4
5
6
7
 
 
 
8
9
 
10
11
 
 
 
 
 
 
 
 
12
13
14
 
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
@@ -1,14 +1,41 @@
+# +# hgtk +# +# contrib/bash_completion +# +# Copyright 2009 Andreas Tscharner <andy@vis.ethz.ch> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +  _hgtk()  { - local cur prev opts + local cur prev opts cmds   - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}"   - opts="about add annotate archive blame checkout clone commit datamine diff filter email forget grep guess hgignore history ignore init incoming log merge outgoing pull push recovery remove rename repoconfig revert rollback serve shelve status strip synch unshelve update userconfig vdiff verify version" + cmds="about add annotate archive blame checkout clone commit datamine diff email explorer filter forget grep guess hgignore history ignore init incoming log merge outgoing pull push recovery remove rename repoconfig revert rollback serve shelve status strip synch unshelve update userconfig vdiff verify version"   - COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + opts="-R --repository -v --verbose -q --quiet -h --help --debugger --nofork --fork --listfile" + + if [[ ${cur} == -* ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + else + COMPREPLY=( $(compgen -W "${cmds}" -- ${cur}) ) + fi + return 0  } -  complete -F _hgtk hgtk
Change 1 of 1 Show Entire File contrib/​docdiff.py Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
@@ -0,0 +1,91 @@
+''' +Binary document diff wrapper script + +This script is converted into an executable by py2exe for use in +TortoiseHg binary packages. It is then used by TortoiseHg as a visual +diff application for binary document types. + +It takes two (diff) or four (merge) arguments, determines the file type +based on the file extension, then launches the appropriate document diff +script that THG has borrowed from the TortoiseSVN project. + +This script is quite useless outside of a TortoiseHg binary install. +''' + +import os +import sys +import subprocess +import win32con +import win32api +import win32process + +from mercurial import util + +scripts = { + 'doc' : ('diff-doc.js', 'merge-doc.js'), # MS Word + 'docx' : ('diff-doc.js', 'merge-doc.js'), + 'docm' : ('diff-doc.js', 'merge-doc.js'), + 'ppt' : ('diff-ppt.js'), # MS PowerPoint + 'pptx' : ('diff-ppt.js'), + 'pptm' : ('diff-ppt.js'), + 'xls' : ('diff-xls.vbs'), # MS Excel + 'xlsx' : ('diff-xls.vbs'), + 'xlsm' : ('diff-xls.vbs'), + 'xlsb' : ('diff-xls.vbs'), + 'xlam' : ('diff-xls.vbs'), + 'ods' : ('diff-odt.vbs', 'merge-ods.vbs'), # OpenOffice Text + 'odt' : ('diff-odt.vbs', 'merge-ods.vbs'), + 'sxw' : ('diff-sxw.vbs', 'merge-ods.vbs'), # OpenOffice Calc + 'nb' : ('diff-nb.vbs'), # Mathematica Notebook +} + +def main(): + args = sys.argv[1:] + if len(args) not in (2, 4): + print 'Two or four arguments expected:' + print sys.argv[0], '[local] [other]' + print sys.argv[0], '[local] [base] [other] [output]' + sys.exit(1) + elif len(args) == 2: + local, other = [os.path.abspath(f) for f in args] + else: + local, base, other, output = [os.path.abspath(f) for f in args] + + base, ext = os.path.splitext(local) + if not ext or ext.lower()[1:] not in scripts.keys(): + print 'Unsupported file type', local + sys.exit(1) + + proc = win32api.GetCurrentProcess() + try: + # This will fail on windows < NT + filename = win32process.GetModuleFileNameEx(proc, 0) + except: + filename = win32api.GetModuleFileName(0) + path = os.path.join(os.path.dirname(filename), 'diff-scripts') + if not os.path.isdir(path): + print 'Diff scripts not found at', path + sys.exit(1) + + use = scripts[ext.lower()[1:]] + if len(args) == 2: + script = os.path.join(path, use[0]) + cmd = ['wscript', script, other, local] + elif len(use) == 1: + print 'Unsupported file type for merge', local + sys.exit(1) + else: + script = os.path.join(path, use[1]) + cmd = ['wscript', script, output, other, local, base] + + cmd = [util.shellquote(arg) for arg in cmd] + cmdline = util.quotecommand(' '.join(cmd)) + proc = subprocess.Popen(cmdline, shell=True, + creationflags=win32con.CREATE_NO_WINDOW, + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE) + return proc.communicate() + +if __name__=='__main__': + main()
Change 1 of 1 Show Entire File contrib/​mergetools.ini Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
133
@@ -0,0 +1,133 @@
+[merge-tools] +; Windows version of BeyondCompare +beyondcompare3.priority=-1 +beyondcompare3.args=$local $other $base /mergeoutput=$output /ro /lefttitle=parent1 /centertitle=base /righttitle=parent2 /outputtitle=merged /automerge /reviewconflicts /solo +beyondcompare3.premerge=False +beyondcompare3.regkey=Software\Scooter Software\Beyond Compare 3 +beyondcompare3.regname=ExePath +beyondcompare3.gui=True +beyondcompare3.diffargs=/lro /lefttitle='$plabel1' /righttitle='$clabel' /solo /expandall $parent $child +beyondcompare3.diff3args=$parent1 $parent2 $child /lefttitle='$plabel1' /centertitle='$clabel' /righttitle='$plabel2' /solo /ro +;beyondcompare3.diff3args=$parent1 $parent2 $ancestor /mergeoutput=$child /lefttitle='$plabel1' /centertitle='$alabel' /righttitle='$plabel2' /outputtitle='$clabel' /solo /expandall /ro +beyondcompare3.dirdiff=True + +araxis.regkey=SOFTWARE\Classes\TypeLib\{46799e0a-7bd1-4330-911c-9660bb964ea2}\7.0\HELPDIR +araxis.regappend=\ConsoleCompare.exe +;araxis.executable=${ProgramFiles}/Araxis/Araxis Merge/ConsoleCompare.exe +araxis.priority=-2 +araxis.args=/3 /a2 /wait /merge /title1:"Other" /title2:"Base" /title3:"Local :"$local $other $base $local $output +araxis.premerge=False +araxis.checkconlict=True +araxis.binary=True +araxis.gui=True +araxis.diffargs=/2 /wait /title1:"$plabel1" /title2:"$clabel" $parent $child +araxis.diff3args=/3 /a2 /wait /title1:"$plabel1" /title2:"$clabel" /title3:"$plabel2" $parent1 $child $parent2 +araxis.dirdiff=True +araxis.dir3diff=True + +kdiff3.priority=-3 +kdiff3.args=--auto --L1 base --L2 parent1 --L3 parent2 $base $local $other -o $output +kdiff3.regkey=Software\KDiff3 +kdiff3.regappend=\kdiff3.exe +kdiff3.fixeol=True +kdiff3.gui=True +kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child +kdiff3.diff3args=--L1 '$plabel1' --L2 '$clabel' --L3 '$plabel2' $parent1 $child $parent2 +;kdiff3.diff3args=--L1 '$alabel' --L2 '$plabel1' --L3 '$plabel2' $ancestor $parent1 $parent2 -o $child +kdiff3.dirdiff=True + +diffmerge.regkey=Software\SourceGear\SourceGear DiffMerge\ +diffmerge.regname=Location +diffmerge.priority=-7 +diffmerge.args=-nosplash -merge -title1=local -title2=merged -title3=other $local $base $other -result=$output +diffmerge.checkchanged=True +diffmerge.gui=True +diffmerge.diffargs=--nosplash --title1='$plabel1' --title2='$clabel' $parent $child +diffmerge.diff3args=--nosplash --title1='$plabel1' --title2='$clabel' --title3='$plabel2' $parent1 $child $parent2 +diffmerge.dirdiff=True + +p4merge.priority=-8 +p4merge.args=$base $local $other $output +p4merge.regkey=Software\Perforce\Environment +p4merge.regname=P4INSTROOT +p4merge.regappend=\p4merge.exe +p4merge.gui=True +p4merge.diffargs=$parent $child +p4merge.diff3args=$child $parent1 $parent2 +p4merge.dirdiff=False + +tortoisemerge.priority=-9 +tortoisemerge.args=/base:$base /mine:$local /theirs:$other /merged:$output +tortoisemerge.regkey=Software\TortoiseSVN +tortoisemerge.checkchanged=True +tortoisemerge.gui=True +tortoisemerge.diffargs=/base:$parent /mine:$child /basename:'$plabel1' /minename:'$clabel' +tortoisemerge.diff3args=/base:$ancestor /mine:$parent1 /theirs:$parent2 /merged:$child /basename:'$alabel' /minename:'$plabel1' /theirsname:'$plabel2' /mergedname:'$clabel' + +ecmerge.priority=-10 +ecmerge.args=$base $local $other --mode=merge3 --title0=base --title1=local --title2=other --to=$output +ecmerge.regkey=Software\Elli\xc3\xa9 Computing\Merge +ecmerge.gui=True +ecmerge.diffargs=$parent $child --mode=diff2 --title1='$plabel1' --title2='$clabel' +ecmerge.diff3args=$child $parent1 $parent2 --mode=diff3 --title0='$clabel' --title1='$plabel1' --title2='$plabel2' +ecmerge.dirdiff=True +ecmerge.dir3diff=True + +winmergeu.regkey=Software\Thingamahoochie\WinMerge\ +winmergeu.regname=Executable +winmergeu.priority=-10 +winmergeu.args=/e /x /wl /ub /dl other /dr local $other $local $output +winmergeu.fixeol=True +winmergeu.checkchanged=True +winmergeu.gui=True +winmergeu.diffargs=/r /e /x /ub /wl /dl '$plabel1' /dr '$clabel' $parent $child +winmergeu.diff3args= +winmergeu.dirdiff=True + +; TortoiseHg diff wrapper for some binary documents, not for merge general use +docdiff.priority=-100 +docdiff.regkey=Software\TortoiseHg +docdiff.regappend=\docdiff.exe +docdiff.args=$local $base $other $output +docdiff.gui=True +docdiff.diffargs=$child $parent +docdiff.diff3args=$parent1 $child $parent2 $child +; These scripts fork processes, so the visual diff window must be used +docdiff.usewin=True + +; Linux only diff tools, listed here for reference +bcompare.priority=-1 +bcompare.args=$local $other $base -mergeoutput=$output -ro -lefttitle=parent1 -centertitle=base -righttitle=parent2 -outputtitle=merged -automerge -reviewconflicts -solo +beyondcompare3.premerge=False +bcompare.gui=True +bcompare.diffargs=-lro -lefttitle='$plabel1' -righttitle='$clabel' -solo -expandall $parent $child +bcompare.diff3args=$parent1 $parent2 $child -lefttitle='$plabel1' -centertitle='$clabel' -righttitle='$plabel2' -solo -expandall +bcompare.dirdiff=True + +meld.gui=True +meld.args=--label='local' $local --label='base' $base --label='other' $other +meld.priority=-2 +meld.diffargs=-a --label='$plabel1' $parent --label='$clabel' $child +meld.diff3args=-a --label='$plabel1' $parent1 --label='$clabel' $child --label='$plabel2' $parent2 +meld.dirdiff=True + +diffuse.priority=-3 +diffuse.args=$local $base $other +diffuse.gui=True +diffuse.diffargs=$parent $child +diffuse.diff3args=$parent1 $child $parent2 +diffuse.dirdiff=False + +xxdiff.priority=-4 +xxdiff.args=--show-merged-pane --exit-with-merge-status --title1 local --title2 base --title3 other --merged-filename $output --merge $local $base $other +xxdiff.gui=True +xxdiff.diffargs=--title1 '$plabel1' $parent --title2 '$clabel' $child +xxdiff.diff3args=--title1 '$plabel1' $parent1 --title2 '$clabel' $child --title3 '$plabel2' $parent2 +xxdiff.dirdiff=True + +tkdiff.args=-L local -L other $local $other -a $base -o $output +tkdiff.gui=True +tkdiff.priority=-5 +tkdiff.diffargs=-L '$plabel1' $parent -L '$clabel' $child +tkdiff.diff3args= +tkdiff.dirdiff=False
 
25
26
27
28
 
29
30
31
 
40
41
42
43
 
44
45
46
 
107
108
109
110
 
111
112
113
 
212
213
214
215
 
216
217
218
 
25
26
27
 
28
29
30
31
 
40
41
42
 
43
44
45
46
 
107
108
109
 
110
111
112
113
 
212
213
214
 
215
216
217
218
@@ -25,7 +25,7 @@
 import subprocess  import urllib   -from mercurial import hg, ui, match, util +from mercurial import hg, ui, match, util, error  from mercurial.node import short    def _thg_path(): @@ -40,7 +40,7 @@
  sys.path.insert(0, thgpath)  _thg_path()   -from tortoisehg.util import paths, debugthg, hglib, cachethg +from tortoisehg.util import paths, debugthg, cachethg  from tortoisehg.hgtk import gtklib    if debugthg.debug('N'): @@ -107,7 +107,7 @@
  return None   try:   return hg.repository(ui.ui(), path=p) - except hglib.RepoError: + except error.RepoError:   return None   except StandardError, e:   debugf(e) @@ -212,7 +212,7 @@
  def get_columns(self):   return nautilus.Column("HgNautilus::80hg_status",   "hg_status", - "HG Status", + "Hg Status",   "Version control status"),     def _get_file_status(self, localpath, repo=None):
 
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
 
75
76
77
78
 
79
80
81
 
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
136
137
138
139
140
141
 
142
143
144
145
146
147
148
149
 
150
151
152
153
154
155
156
157
158
159
160
161
162
163
 
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
 
23
24
25
 
26
27
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
30
31
32
33
 
45
46
47
 
48
49
50
51
 
71
72
73
 
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
76
77
 
 
 
 
 
 
78
79
 
 
 
 
 
 
 
 
 
 
80
81
82
 
88
89
90
 
 
 
 
 
 
 
 
 
91
92
93
@@ -23,41 +23,11 @@
 editor = notepad    ; In order to push/pull over ssh you must specify a ssh tool -ssh = "{app}\TortoisePlink.exe" -ssh -2 +ssh = "TortoisePlink.exe" -ssh -2  ;ssh = C:\cygwin\bin\ssh   -[merge-tools] -kdiff3.priority=-1 -kdiff3.args=-L1 base --L2 local --L3 other $base $local $other -o $output -kdiff3.regkey=Software\KDiff3 -kdiff3.regappend=\kdiff3.exe -kdiff3.fixeol=True -kdiff3.gui=True -beyondcompare3.priority=-2 -beyondcompare3.args=$local $other $base $output /ro /lefttitle=local /centertitle=base /righttitle=other /automerge /reviewconflicts /solo -beyondcompare3.regkey=Software\Scooter Software\Beyond Compare 3 -beyondcompare3.regname=ExePath -beyondcompare3.gui=True -diffmerge.priority=-7 -diffmerge.args=--nosplash --merge --title1=base --title2=local --title3=other $base $local $other -diffmerge.checkchanged=True -diffmerge.gui=True -p4merge.priority=-8 -p4merge.args=$base $local $other $output -p4merge.regkey=Software\Perforce\Environment -p4merge.regname=P4INSTROOT -p4merge.regappend=\p4merge.exe -p4merge.gui=True -tortoisemerge.priority=-9 -tortoisemerge.args=/base:$output /mine:$local /theirs:$other /merged:$output -tortoisemerge.regkey=Software\TortoiseSVN -tortoisemerge.gui=True -winmergeu.regkey=Software\Thingamahoochie\WinMerge\ -winmergeu.regname=Executable -winmergeu.priority=-10 -winmergeu.args=/e /ub /dl other /dr local $other $local $output -winmergeu.fixeol=True -winmergeu.gui=True +%include mergetools.ini +%include mergepatterns.ini    ;  ; For more information about mercurial extensions, start here @@ -75,7 +45,7 @@
 ; Warning: the color extension is not recommended for Windows  ;color =  ;convert = -extdiff = +;extdiff =  ;fetch =  ;gpg =  ;graphlog = @@ -101,63 +71,12 @@
 ;fold =  ;hgcr-gui =   -; To use cleverencode/cleverdecode, you must enable win32text extension  ; -; By default, we try to encode and decode all files that do not -; contain ASCII NUL characters. What this means is that we try to set -; line endings to Windows style on update, and to Unix style on -; commit. This lets us cooperate with Linux and Unix users, so -; everybody sees files with their native line endings. - -[encode] -; Encode files that don't contain NUL characters. - -; ** = cleverencode: - -; Alternatively, you can explicitly specify each file extension that -; you want encoded (any you omit will be left untouched), like this: - -; *.txt = dumbencode: - - -[decode] -; Decode files that don't contain NUL characters. - -; ** = cleverdecode: - -; Alternatively, you can explicitly specify each file extension that -; you want decoded (any you omit will be left untouched), like this: - -; **.txt = dumbdecode: - -[patch] -; If you enable win32text filtering, you will want to enable this -; line as well to allow patching to work correctly. - -; eol = crlf - - -; -; Define external diff commands +; Define external diff commands, for hg command line use only  ;  [extdiff] -cmd.vdiff = {app}\kdiff3 -opts.vdiff = $parent1 $child $parent2 -;cmd.bc3diff = C:\Program Files\Beyond Compare 3\BCompare.exe -;cmd.vdiff = C:\Progra~1\TortoiseSVN\bin\TortoiseMerge.exe -;cmd.vimdiff = gvim.exe -;opts.vimdiff = -f '+next' '+execute "DirDiff ".argv(0)." ".argv(1)' +;kdiff3 =   -[qct] -;See http://bitbucket.org/tortoisehg/stable/wiki/FAQ for details -;path="C:\Program Files\qct\qct.exe" - -[hgk] -;See http://bitbucket.org/tortoisehg/stable/wiki/FAQ for details -;path={app}\scripts\hgk.cmd -;vdiff=vdiff - -;  ; The git extended diff format will properly store binary files,  ; file permission changes, and rename information that the normal  ; patch format cannot cover. However it is also not 100% compatible @@ -169,15 +88,6 @@
 ;nodates = false    ; -; Some optional defaults -; -[defaults] -;view = --limit 100 -;log = --limit 100 -;revert = --no-backup -;log = --style=changelog - -;  ; Keyword extension example configuration. To use, one must  ; enable the keyword extension, then uncomment and modify these  ; two sections. Before using the keyword extension, be sure to
Change 1 of 1 Show Entire File contrib/​win32/​mergepatterns.ini Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@@ -0,0 +1,24 @@
+[merge-patterns] +**.doc = docdiff +**.docx = docdiff +**.docm = docdiff +**.ods = docdiff +**.odt = docdiff +**.sxw = docdiff + +[diff-patterns] +**.doc = docdiff +**.docx = docdiff +**.docm = docdiff +**.ppt = docdiff +**.pptx = docdiff +**.pptm = docdiff +**.xls = docdiff +**.xlsx = docdiff +**.xlsm = docdiff +**.xlsb = docdiff +**.xlam = docdiff +**.ods = docdiff +**.odt = docdiff +**.sxw = docdiff +**.nb = docdiff
Change 1 of 5 Show Entire File contrib/​win32/​tortoisehg.iss Stacked
renamed from contrib/win32/mercurial.iss
 
6
7
8
9
 
10
11
12
 
21
22
23
24
25
26
 
 
 
27
28
29
 
50
51
52
53
54
55
56
57
58
59
60
 
 
 
 
61
62
63
64
65
 
 
 
66
67
68
 
82
83
84
 
85
86
87
 
229
230
231
 
 
 
232
233
234
 
6
7
8
 
9
10
11
12
 
21
22
23
 
 
 
24
25
26
27
28
29
 
50
51
52
 
 
 
 
 
 
 
 
53
54
55
56
57
58
59
60
 
61
62
63
64
65
66
 
80
81
82
83
84
85
86
 
228
229
230
231
232
233
234
235
236
@@ -6,7 +6,7 @@
 #endif    [Setup] -AppCopyright=Copyright 2005-2009 Matt Mackall and others +AppCopyright=Copyright 2008-2010 Steve Borho and others  AppName=TortoiseHg  AppVerName=TortoiseHg {#VERSION}  InfoAfterFile=contrib/win32/postinstall.txt @@ -21,9 +21,9 @@
 OutputBaseFilename=TortoiseHg-{#VERSION}  DefaultDirName={pf}\TortoiseHg  SourceDir=..\.. -VersionInfoDescription=Mercurial distributed SCM -VersionInfoCopyright=Copyright 2005-2009 Matt Mackall and others -VersionInfoCompany=Matt Mackall and others +VersionInfoDescription=TortoiseHg (with Mercurial) +VersionInfoCopyright=Copyright 2008-2010 Steve Borho and others +VersionInfoCompany=Steve Borho and others  InternalCompressLevel=max  SolidCompression=true  SetupIconFile=icons\thg_logo.ico @@ -50,19 +50,17 @@
 Name: shell; Description: Shell integration (overlay icons, context menu) [admin required]; Types: full; Flags: restart; Check: ShellInstallPossible    [Files] -Source: ..\build-hg\contrib\mercurial.el; DestDir: {app}/contrib -Source: ..\build-hg\contrib\vim\*.*; DestDir: {app}/contrib/vim -Source: ..\build-hg\contrib\zsh_completion; DestDir: {app}/contrib -Source: ..\build-hg\contrib\hgk; DestDir: {app}/contrib -Source: ..\build-hg\contrib\win32\ReadMe.html; DestDir: {app}; Flags: isreadme -Source: ..\build-hg\templates\*.*; DestDir: {app}\templates; Flags: recursesubdirs createallsubdirs -Source: ..\build-hg\locale\*.*; DestDir: {app}\locale; Flags: recursesubdirs createallsubdirs -Source: ..\build-hg\help\*.*; DestDir: {app}\help +Source: ..\build-hg\mercurial\help\*.txt; DestDir: {app}\help +Source: ..\build-hg\mercurial\templates\*.*; DestDir: {app}\templates; Flags: recursesubdirs createallsubdirs +Source: ..\build-hg\mercurial\locale\*.*; DestDir: {app}\locale; Flags: recursesubdirs createallsubdirs +Source: ..\build-hg\contrib\xml.rnc; DestDir: {app}/contrib  Source: ..\build-hg\i18n\*.*; DestDir: {app}\i18n  Source: ..\build-hg\doc\*.html; DestDir: {app}\docs; Flags: ignoreversion; Components: help  Source: ..\build-hg\doc\style.css; DestDir: {app}\docs; Flags: ignoreversion; Components: help  Source: {app}\Mercurial.ini; DestDir: {app}\backup; Flags: external skipifsourcedoesntexist uninsneveruninstall -Source: contrib\win32\mercurial.ini; DestDir: {app}; DestName: Mercurial.ini; AfterInstall: FileExpandString('{app}\Mercurial.ini') +Source: contrib\win32\mercurial.ini; DestDir: {app}; DestName: Mercurial.ini +Source: contrib\win32\mergepatterns.ini; DestDir: {app} +Source: contrib\mergetools.ini; DestDir: {app}  Source: contrib\win32\mercurialuser.ini; DestDir: {%USERPROFILE}; DestName: Mercurial.ini; AfterInstall: FileExpandStringEx('{%USERPROFILE}\Mercurial.ini'); Flags: onlyifdoesntexist  Source: ReleaseNotes.txt; DestDir: {app}; DestName: ReleaseNotes.txt  Source: ..\contrib\*.exe; DestDir: {app} @@ -82,6 +80,7 @@
 Source: win32\*.reg; DestDir: {app}\cmenu_i18n  Source: COPYING.txt; DestDir: {app}; DestName: Copying.txt  Source: icons\thg_logo.ico; DestDir: {app} +Source: ..\contrib\diff-scripts\*.*; DestDir: {app}\diff-scripts  Source: ..\misc\hgbook.pdf; DestDir: {app}/docs; Flags: ignoreversion; Components: hgbook  Source: ..\misc\ThgShellx86.dll; DestDir: {app}; DestName: ThgShell.dll; Check: not Is64BitInstallMode; Flags: ignoreversion restartreplace uninsrestartdelete; Components: shell  Source: ..\misc\ThgShellx86.dll; DestDir: {app}; DestName: ThgShellx86.dll; Check: Is64BitInstallMode; Flags: ignoreversion restartreplace uninsrestartdelete; Components: shell @@ -229,6 +228,9 @@
  TaskbarMutex := 'thgtaskbar,Global\thgtaskbar';   tries := 0;   while (tries < 4) and CheckForMutexes(TaskbarMutex) do begin + TaskbarWindow := FindWindowByWindowName('TortoiseHg Overlay Icon Server'); + if TaskbarWindow <> 0 then + SendMessage(TaskbarWindow, wm_Close, 0, 0);   TaskbarWindow := FindWindowByWindowName('TortoiseHg RPC server');   if TaskbarWindow <> 0 then   SendMessage(TaskbarWindow, wm_Close, 0, 0);
Change 1 of 2 Show Entire File doc/​Build.bat Stacked
 
58
59
60
61
 
62
63
64
 
75
76
77
78
79
80
81
82
83
84
 
 
 
 
 
 
 
85
86
87
 
58
59
60
 
61
62
63
64
 
75
76
77
 
 
 
 
 
 
 
78
79
80
81
82
83
84
85
86
87
@@ -58,7 +58,7 @@
   if "%1" == "chm" (   %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %OUTPUTDIR%/chm - %hhc_compiler% %OUTPUTDIR%/chm/TortoiseHG.hhp + %hhc_compiler% %OUTPUTDIR%/chm/TortoiseHg.hhp   echo.   echo.Build finished. The CHM file is in %OUTPUTDIR%/chm.   goto end @@ -75,13 +75,13 @@
  %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %OUTPUTDIR%/pdf   pushd .   cd %OUTPUTDIR%\pdf - %PDFLATEX% TortoiseHG.tex - %PDFLATEX% TortoiseHG.tex - %PDFLATEX% TortoiseHG.tex - makeindex -s python.ist TortoiseHG.idx - makeindex -s python.ist modTortoiseHG.idx - %PDFLATEX% TortoiseHG.tex - %PDFLATEX% TortoiseHG.tex + %PDFLATEX% TortoiseHg.tex + %PDFLATEX% TortoiseHg.tex + %PDFLATEX% TortoiseHg.tex + makeindex -s python.ist TortoiseHg.idx + makeindex -s python.ist modTortoiseHg.idx + %PDFLATEX% TortoiseHg.tex + %PDFLATEX% TortoiseHg.tex   popd   echo.   echo.Build finished; the PDF file is in %OUTPUTDIR%/pdf.
Change 1 of 1 Show Entire File doc/​TODO Stacked
 
1
 
 
2
 
 
 
 
 
1
2
3
4
5
6
7
8
@@ -1,2 +1,8 @@
 Describe path editing and [auth] hgrc section +Finish patch page +  Need a page explaining merges and merge undo (tie together various parts) + +figures/visual-diff.jpg +new figure for p4pending +new figure for import, email
 
332
333
334
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
335
336
337
 
341
342
343
 
 
344
345
346
 
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
 
380
381
382
383
384
385
386
387
@@ -332,6 +332,45 @@
 patches into a repository, so this must be done on the command line with  the :command:`hg import` command.   +Message Parsing +--------------- + +New in TortoiseHg 0.10, the repository browser will detect and underline +changeset hashes, HTTP(s) URLs, and bug report identifiers inside +changeset messages. These underlined phrases are clickable links. + +Every word-boundary delimited string of 12 or 40 characters from the +range [0-9a-f] is considered a changeset link. Clicking on it in the +repository explorer will jump to the given changeset if possible. + +HTTP and HTTPS URLs are similarly turned into clickable links which are +opened in your default web browser. + +Issue tracker links are enabled when configured in the tortoisehg +section of your configuration files. Since only a single issue tracker +can be configured at a time, it is typically configured in the +repository's :file:`.hg/hgrc` file. There are two keys: issue.regex and +issue.link. The first defines the regex to match when picking up issue +numbers, while the second defines the command to run when an issue +number is recognized. + +You may include groups in issue.regex, and corresponding {n} tokens in +issue.link (where n is a non-negative integer). {0} refers to the entire +string matched by issue.regex, while {1} refers to the first group and +so on. If no {n} tokens are found in issue.link, the entire matched +string is appended instead. + +Examples:: + + BitBucket: + issue.regex = #(\d+)\b + issue.link = http://bitbucket.org/<your project and repo>/issue/{1}/ + + Mercurial: + issue.regex = \bissue\d+\b + issue.link = http://mercurial.selenic.com/bts/ + +  Keyboard navigation  -------------------   @@ -341,6 +380,8 @@
  Display visual diffs for selected changeset or file  :kbd:`Ctrl-R`   Refresh repository contents +:kbd:`Ctrl-G` + Go to a specific revision      Configurables
 
24
25
26
 
 
 
 
 
 
27
28
29
 
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
 
104
105
106
107
 
108
109
110
 
24
25
26
27
28
29
30
31
32
33
34
35
 
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
 
186
187
188
 
189
190
191
192
@@ -24,6 +24,12 @@
 :kbd:`Ctrl-Enter`   activation   +:kbd:`Ctrl-.` and :kbd:`Ctrl-,` + select next or previous file in a file list + +:kbd:`Ctrl-[` and :kbd:`Ctrl-]` + page up or down a text pane +  :kbd:`F5`, :kbd:`Ctrl-R`   refresh   @@ -40,47 +46,123 @@
    Visual Diff Window   -TortoiseHg 0.8 introduced a visual diff dialog that solves four -usability issues: +In TortoiseHg 0.10, the visual (external) diff infrastructure was +refactored. The new system uses tool descriptions in +:file:`mergetools.ini` to detect most common diff tools on your computer +(including TortoiseMerge, which ships in our installer) and select the +best available tool.   -1) Allows you to select a visual diff tool for each individual file -2) Allows you to use visual diff tools that fork background processes -3) Allows you to use visual diff tools that do not support directory diffs -4) Provides feedback when no files were modified +If the user has selected a merge tool +(:menuselection:`TortoiseHg --> Three-way Merge Tool`), that tool will +also be used to perform visual diffs, bypassing the tool selection +process. However the user can still select a separate tool +(:menuselection:`TortoiseHg --> Visual Diff Tool`) for visual diffs if +they chose.   -Providing visual diffs requires TortoiseHg to generate temporary files -which contain older versions of data. Those temporary files are deleted -when the visual diff dialog is closed. +The merge tool configuration file contains optimal command lines for +each tool, so no further configuration is required by the user. They +only need to select the tools they wish use, or accept the defaults.   -If you would like to bypass this visual diff window and directly launch -your visual diff tool open the global settings dialog and set -:menuselection:`TortoiseHg --> Skip Diff Window` to true. +The visual diff system will use any existing extdiff configuration it +finds. Since extdiff did not support three way diff arguments until +very recently and still does not support label arguments, you will +likely have a better experience by disabling or deleting any extdiff +configuration you may have. + +The visual diff system will directly use the selected diff tool unless +the action you are attempting requires the use of the TortoiseHg visual +diff window. The list of conditions includes: + +1) The selection of files being compared require multiple tools +2) The selected tool forks detached background processes +3) The selected tool does not support the required directory diffs +4) The selected tool does not support three way comparisons +5) The file changes include renames or copies + +When the visual diff window is used, the temporary files are cleaned up +when the dialog is closed. Thus it should be left open until you close +all of your diff tool instances. When your diff tool is launched +directly, the temporary files are deleted when your tool exits. + +If your diff tool is launched directly to compare a working copy file, +it will directly diff against the working file so you may modify it from +within the diff tool. If you are comparing multiple files, the visual +diff system will make a snapshot of the working copy files and track +their initial sizes and timestamps. When your diff tool exits, the +system compares the sizes and timestamps and copies modified files back +over the original working copies. In this way, you can still modify +your working copy files from your visual diff tool even when performing +directory comparisons. + +When the visual diff window is used to compare working copy files, it +always directly diffs against the working copy files since it always +operates on a single file at a time.    .. note:: - The `Skip Diff Window` configurable does not change the behavior of - visual diffs launched by the shell context menu. The visual diff - window is always shown. + The :menuselection:`TortoiseHg --> Skip Diff Window` configurable + has been removed because it is now redundant.   -.. warning:: - When you bypass the visual diff window, your visual diff tool must - be able to handle directory diffs and it must not fork a background - process. Caveat emptor. +Adding Tools +~~~~~~~~~~~~   -Configuring a visual diff application for use in TortoiseHg is a two -step process. First you must configure your application as an -`Extdiff <http://mercurial.selenic.com/wiki/ExtdiffExtension>`_ -command in your user :file:`Mercurial.ini`:: +If you have a visual diff tool installed that is not supported by +TortoiseHg, you can create a tool configuration for it in your user +:file:`Mercurial.ini` file. See Mercurial's +`documentation <http://www.selenic.com/mercurial/hgrc.5.html#merge-tools>`_ +on how to configure your tool for use in file merges. When that is +complete, you can add the extra keys used by TortoiseHg for visual +diff::   - [extdiff] - myapp = C:\Path\to\tool.exe + diffargs: the arguments to use for two-way file comparisons + diff3args: the arguments to use for three-way file comparisons + dirdiff: this tool supports two-way directory comparisons + dir3diff: this tool supports three-way directory comparisons   -Then you can select `myapp` from the list of available extdiff -commands in :menuselection:`TortoiseHg --> Visual Diff Command`. -See the :doc:`faq` for some configuration examples. +When building command line arguments, you can use the following +variables::   -When more than one `Extdiff` command is configured, the visual diff -window will allow you to select the command to use as you open each -file. + $parent1: the file or directory from the first parent revision + $parent2: the file or directory from the second parent revision + $child: the file or directory from the revision being compared + $ancestor: the file or directory from the ancestor of a merge + $parent: a synonym for $parent1 + + $plabel1: a symbolic name for the first parent revision + $plabel2: a symbolic name for the second parent revision + $clabel: a symbolic name for the revision being compared + $alabel: a symbolic name for the ancestor revision + +Obviously, $parent2 and $ancestor are only meaningful when used in three +way diff arguments, for viewing merge changesets. If your diff tool +cannot use the ancestor revision in any productive way, it is safe to +leave it out of the diff3args command line. + +.. note:: + On Windows, the `executable` parameter can use environment variables + using the syntax ${ProgramFiles} + +If unconfigured, the default value of **diffargs** is '$parent $child'. +The default value of **diff3args** is "", indicating the visual diff +tool cannot perform three way comparisons. + +If you create a new visual diff tool configuration, or improve upon an +existing configuration, please email it to our development mailing list +so it may be incorporated in a future release. + + +Word Diffs +~~~~~~~~~~ + +The TortoiseHG Windows installers now include TortoiseSVN's scripts for +comparing (and sometimes merging) many binary document formats. These +are configured in the site-wide :file:`mergepatterns.ini` as handlers for +each binary format's common file extensions, so no user intervention is +required. + +In order to support file extension based tool selection, TortoiseHg has +added support for a **[diff-patterns]** section equivalent to Mercurial's +`merge-patterns <http://www.selenic.com/mercurial/hgrc.5.html#merge-patterns>`_ +section.      Treeview searches @@ -104,7 +186,7 @@
 * The mouse scroll wheel will advance forwards and backwards through   matching lines   -HG command dialog +Hg command dialog  -----------------    Many TortoiseHg tools use the *hgcmd* dialog to execute Mercurial
 
49
50
51
52
 
53
54
 
55
56
57
 
49
50
51
 
52
53
 
54
55
56
57
@@ -49,9 +49,9 @@
 # built documents.  #  # The short X.Y version. -version = '0.9' +version = '0.10'  # The full version, including alpha/beta/rc tags. -release = '0.9.1' +release = '0.10.0'    # The language for content autogenerated by Sphinx. Refer to documentation  # for a list of supported languages.
 
106
107
108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
 
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
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
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
@@ -106,4 +106,197 @@
  [extensions]   hgcr-gui=   +Perfarce +======== + +`Perfarce <http://www.kingswood-consulting.co.uk/hg/perfarce/>`_ home +page. + +This extension modifies the remote repository handling so that repository +paths that resemble:: + + p4://p4server[:port]/clientname + +cause operations on the named p4 client specification on the p4 server. +The client specification must already exist on the server before using +this extension. Making changes to the client specification Views causes +problems when synchronizing the repositories, and should be avoided. + +Five built-in Mercurial commands are overridden. + +outgoing:: + + If the destination repository name starts with p4:// then this + reports files affected by the revision(s) that are in the local + repository but not in the p4 depot. + +push:: + + If the destination repository name starts with p4:// then this + exports changes from the local repository to the p4 depot. If no + revision is specified then all changes since the last p4 changelist + are pushed. In either case, all revisions to be pushed are foled + into a single p4 changelist. Optionally the resulting changelist is + submitted to the p4 server, controlled by the --submit option to + push, or by setting **perfarce.submit** to True. If the option + **perfarce.keep** is False then after a successful submit the files + in the p4 workarea will be deleted. + +pull:: + + If the source repository name starts with p4:// then this imports + changes from the p4 depot, automatically creating merges of + changelists submitted by hg push. If the config option + **perfarce.keep** is False then the import does not leave files in + the p4 workarea, otherwise the p4 workarea will be updated with the + new files. + +incoming:: + + If the source repository name starts with p4:// then this + reports changes in the p4 depot that are not yet in the local + repository. + +clone:: + + If the source repository name starts with p4:// then this + creates the destination repository and pulls all changes from + the p4 depot into it. + +**TortoiseHg Integration** + +When the perfarce extension is enabled, it adds a :guilabel:`start revision` +configurable option to the clone tool, and a :guilabel:`Perforce` menu +to the Repository Explorer. The menu has two items: + +identity:: + + Finds the tip Perforce changelist in your local repository and + selects it in the changelog window. + +pending:: + + Detects pending Perforce changelists that have been "push"ed to your + Perforce client but have not been submitted, or have not been pulled + back. This opens the pending changelist dialog so that you can view + these pending changelists and either submit or revert them. + +**Installation** + +You may want to add it to your Mercurial.ini or a repository's hgrc like this:: + + [extensions] + perfarce= + +HGEOL +===== + +The hgeol extension is the eventual successor to the win32text +extension. It tries to resolve the EOLN compatibility problems in a +more complete and robust fashion. Instead of documenting it here, we +will link to it's online documents which are continually evolving. + +* `EOLTranslationPlan <http://mercurial.selenic.com/wiki/EOLTranslationPlan>`_ +* `Source code <http://bitbucket.org/mg/hg-eol/>`_ + +Mercurial-Keyring +================= + +* `Mercurial Keyring <http://pypi.python.org/pypi/mercurial_keyring>`_ home page +* `Wiki page <http://mercurial.selenic.com/wiki/KeyringExtension>`_ + +Keyring extension uses services of the keyring library to securely save +authentication passwords (HTTP/HTTPS and SMTP) using system specific +password database (Gnome Keyring, KDE KWallet, OSXKeyChain, dedicated +solutions for Win32 and command line). + +**What it does** + +The extension prompts for the HTTP password on the first pull/push +to/from given remote repository (just like it is done by default), but +saves the password (keyed by the combination of username and remote +repository url) in the password database. On the next run it checks for +the username in .hg/hgrc, then for suitable password in the password +database, and uses those credentials if found. + +Similarly, while sending emails via SMTP server which requires +authorization, it prompts for the password on first use of given server, +then saves it in the password database and reuses on successive runs. + +In case password turns out incorrect (either because it was invalid, or +because it was changed on the server) it just prompts the user again. + +**Installation** + +First, the extension must be enabled in your Mercurial.ini file as:: + + [extensions] + mercurial_keyring= + +**Password backend configuration** + +The most appropriate password backend should usually be picked automatically, +without configuration. Still, if necessary, it can be configured using +~/keyringrc.cfg file (keyringrc.cfg in the home directory of the current user). +Refer to `keyring docs <http://pypi.python.org/pypi/keyring>`_ +for more details. + +.. note:: + On Windows, it will default to storing your encrypted passwords in + the system registry under HKCU\\Software\\Mercurial\\Keyring. No + configuration is required. + +**Repository configuration (HTTP)** + +Edit repository-local .hg/hgrc and save there the remote repository path and +the username, but do not save the password. For example:: + + [paths] + myremote = https://my.server.com/hgrepo/someproject + + [auth] + myremote.schemes = http https + myremote.prefix = my.server.com/hgrepo + myremote.username = mekk + +Simpler form with url-embedded name can also be used:: + + [paths] + bitbucket = https://User@bitbucket.org/User/project_name/ + +.. note:: + If both username and password are given in .hg/hgrc, extension will + use them without using the password database. If username is not + given, extension will prompt for credentials every time, also + without saving the password. So, in both cases, it is effectively + reverting to the default behaviour. + +Consult `[auth] <http://www.selenic.com/mercurial/hgrc.5.html#auth>`_ +section documentation for more details. + +**Repository configuration (SMTP)** + +Edit either repository-local .hg/hgrc, or ~/.hgrc (the latter is usually +preferable) and set there all standard email and smtp properties, including +smtp username, but without smtp password. For example:: + + [email] + method = smtp + from = Joe Doe <Joe.Doe@remote.com> + + [smtp] + host = smtp.gmail.com + port = 587 + username = JoeDoe@gmail.com + tls = true + +Just as in case of HTTP, you must set username, but must not set password here +to use the extension, in other cases it will revert to the default behaviour. + +**Usage** + +Configure the repository as above, then just pull and push (or email) You +should be asked for the password only once (per every username + +remote_repository_url combination). +  .. vim: noet ts=4
 
14
15
16
17
 
 
18
19
20
 
14
15
16
 
17
18
19
20
21
@@ -14,7 +14,8 @@
  `Mercurial <http://mercurial.selenic.com/wiki/>`_,   `kdiff3 <http://kdiff3.sourceforge.net/>`_,   `TortoisePlink <http://www.chiark.greenend.org.uk/%7Esgtatham/putty/>`_ - and two bonus extensions: hgfold, hgcr-gui. + and five bonus extensions: hgfold, hgcr-gui, perfarce, hgeol, + mercurial-keyring.    *How can I get translations for the Explorer context menu?*  
 
18
19
20
 
21
22
23
 
18
19
20
21
22
23
24
@@ -18,6 +18,7 @@
  daily   settings   recovery + patches   extensions   faq   debugging
 
83
84
85
86
87
 
 
88
89
 
90
91
 
92
93
94
 
83
84
85
 
 
86
87
88
 
89
90
 
91
92
93
94
@@ -83,12 +83,12 @@
 `download <http://bitbucket.org/tortoisehg/stable/wiki/download/>`_  page of the wiki.   -Deb packages for Ubuntu can be found at -`that <https://launchpad.net/~tortoisehg-ppa>`_. +Packages for Ubuntu can be found at the TortoiseHg +`PPA <https://launchpad.net/~tortoisehg-ppa>`_ web site.   -For MacOSX, no packages are available but you can run hgtk and all the +For Mac OS X, no packages are available but you can run hgtk and all the  dialogs via the source install method. For details, see -`MacOSX <http://bitbucket.org/tortoisehg/stable/wiki/MacOSX>`_. +`Mac OS X <http://bitbucket.org/tortoisehg/stable/wiki/MacOSX>`_.    Language settings  ^^^^^^^^^^^^^^^^^
Change 1 of 1 Show Entire File doc/​source/​patches.txt Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
@@ -0,0 +1,128 @@
+******* +Patches +******* + +.. module:: patches + :synopsis: Describe patch operations + +Defining a patch +================ + +These links are recommended reading for understanding the history and nature +of patches and how they can be used with Mercurial. + +* `The patch management problem <http://tortoisehg.bitbucket.org/hgbook/1.4/managing-change-with-mercurial-queues.html#sec:mq:patch-mgmt>`_ +* `Understanding patches <http://tortoisehg.bitbucket.org/hgbook/1.4/managing-change-with-mercurial-queues.html#sec:mq:patch>`_ +* `More about patches <http://tortoisehg.bitbucket.org/hgbook/1.4/managing-change-with-mercurial-queues.html#sec:mq:adv-patch>`_ + +Pitfalls +======== + +The standard patch format cannot describe binary files, renames, copies, +or permission changes. If your patch needs to record any of those +things, you will need to enable **git** patches via:: + + [diff] + git=True + +Mercurial 1.5 improves it's behavior in this regard. It will warn you +when git diffs are required, or sometimes upgrade to the git format +automatically. +`diff section <http://www.selenic.com/mercurial/hgrc.5.html#diff>`_. + +Mercurial's patch routines do not deal well with mixed EOLN between +source files and patches. The **patch.eol** setting was introduced in +1.3 to improve this situation:: + + [patch] + eol = auto #strict, lf, or crlf + +The work on the hgeol extension is also improving this area. Perhaps it +will be resolved by hg-1.5. +`patch section <http://www.selenic.com/mercurial/hgrc.5.html#patch>`_. + +Applying a patch is not a foolproof operation. If the source file has +diverged from the file that was used to create the patch, there may be +conflicts during the patch application. These are written to a file +with an .rej extension. Currently, these rejected changes must be +manually resolved by the user. + + +Export Patches +============== + +Changeset +--------- + +To export a changeset as a patch file, use the changeset context menu of +the Repository Explorer to select :menuselection:`Export --> Export Patch`. +You will be asked to provide a filename. + +Changeset Ranges +---------------- + +Select a range of changesets in the Repository Explorer. Left click on +the first (base) changeset, then right click on the last (target) +changeset. This opens a special revision range context menu. From this +menu you can generate patches, generate a bundle, send emails, or view +the accumulated changes. + +This is a very powerful feature and there is no restriction on the base +and target changesets you can select. + +Email +----- + +To send a changeset as an email, use the changeset context menu of the +Repository Explorer. :menuselection:`Export --> Email Patch`. This +opens the e-mail dialog for this single changeset. + +To send a changeset range, use the changeset range selection feature of +the Repository Explorer and select +:menuselection:`Email from here to selected...` + +Lastly, you can use the :guilabel:`Email` button on the syncbar of the +Repository Explorer to email all outgoing changes to the selected remote +repository. + +.. note:: + You must configure + `SMTP <http://www.selenic.com/mercurial/hgrc.5.html#smtp>`_ + to send patches via email + +Cherry Picking +-------------- + +Use the changeset range selection feature of the Repository Explorer and +select :menuselection:`Diff with selected`. This opens up a status +viewer showing you the accumulated changes between your base and target +changesets. + +From the status viewer, you can select files and diff hunks just as you +can in the commit tool, and preview the final result in the +:guilabel:`Save Preview` tab. Pressing :guilabel:`Save As` will save +the selected changes to a patch file. + +For even finer cherry-picking, you can highlight a number of diff-hunks +in the hunk selection pane and hit CTRL-C. This will copy the +highlighted (mouse selected, not toggled) hunks to the clipboard. + +.. note:: + Reversing the order of your selection reverses the effect of the + patch. + + +Import Patches +============== + +Import dialog +Pitfall: requires clean working directory state +Pitfall: hg import can spawn an editor if patch has no header + + +Patch Queues +============ + +MQ pane in Repository Explorer, Commit tool. + +.. vim: noet ts=4
 
140
141
142
143
 
144
145
146
 
140
141
142
 
143
144
145
146
@@ -140,7 +140,7 @@
 ======    Commit your local repository by right-clicking anywhere in the folder, -or on the folder itself, and then selecting :guilabel:`HG Commit ...`, +or on the folder itself, and then selecting :guilabel:`Hg Commit ...`,  or from command line type :command:`hgtk commit`. Write a commit  message, select the files you wish to commit, then press  :guilabel:`Commit`. If, after the commit, you realize that something was
 
86
87
88
89
90
 
 
 
 
 
91
92
93
 
190
191
192
193
194
195
196
197
198
199
200
201
 
410
411
412
 
 
 
 
 
 
 
 
 
 
413
414
415
 
86
87
88
 
 
89
90
91
92
93
94
95
96
 
193
194
195
 
 
 
 
 
 
196
197
198
 
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
@@ -86,8 +86,11 @@
  or other, or :guilabel:`internal:dump` to leave files in the working   directory for manual merging.   -:guilabel:`Visual Diff Command:` - Specify visual diff tool; must be an extdiff command. +:guilabel:`Visual Diff Tool:` + Specify visual diff tool as described in the [merge-tools] section + of your Mercurial configuration files. If left unspecified, + TortoiseHg will use the selected merge tool. Failing that it uses + the first applicable tool it finds.    :guilabel:`Skip Diff Window:`   Bypass the builtin visual diff dialog and directly use your @@ -190,12 +193,6 @@
  changelog viewer in a single batch.   Default: 500.   -:guilabel:`Copy Hash:` - Allow the changelog viewer to copy the changeset hash - of the currently selected changeset into the clipboard. - DEPRECATED, will be removed in a later release. - Default: False. -  :guilabel:`Dead Branches:`   Comma separated list of branch names that should be ignored when   building a list of branch names for a repository. Default: None @@ -410,6 +407,16 @@
  Ignore changes whose lines are all blank.   Default: False.   +Removed this release +==================== + +:guilabel:`Copy Hash:` + Allow the changelog viewer to copy the changeset hash + of the currently selected changeset into the clipboard. + Default: False. + +To copy the hash of a changeset to the clipboard, use the 'Copy Hash' +context menu option.    Keyboard navigation  ===================
 
141
142
143
144
 
145
146
147
 
141
142
143
 
144
145
146
147
@@ -141,7 +141,7 @@
 in mailing lists.    Please consult the Mercurial documentation for the differences between -plain patches, HG patches, Git patches, and bundles. +plain patches, Hg patches, Git patches, and bundles.    From command line  -----------------
Added image
Added image
Added image
Added image
Change 1 of 1 Show Entire File setup.py Stacked
 
113
114
115
116
 
 
 
117
118
119
 
113
114
115
 
116
117
118
119
120
121
@@ -113,7 +113,9 @@
  }   extra['console'] = [   {'script':'contrib/hg', 'icon_resources':[(0,'icons/hg.ico')]}, - {'script':'hgtk', 'icon_resources':[(0,'icons/thg_logo.ico')]} + {'script':'hgtk', 'icon_resources':[(0,'icons/thg_logo.ico')]}, + {'script':'contrib/docdiff.py', + 'icon_resources':[(0,'icons/TortoiseMerge.ico')]}   ]   extra['windows'] = [   {'script':'thgtaskbar.py',
Change 1 of 13 Show Entire File thgtaskbar.py Stacked
 
1
2
 
 
3
4
5
 
28
29
30
31
32
33
34
35
36
37
38
 
39
40
41
42
43
 
93
94
95
96
97
98
99
100
 
 
 
101
102
103
 
115
116
117
118
119
 
120
121
122
 
130
131
132
133
134
135
136
137
138
 
139
140
141
 
143
144
145
146
147
148
149
150
 
151
152
153
 
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
 
208
209
210
211
 
212
213
214
215
216
217
218
 
 
 
219
220
221
222
223
 
 
 
 
 
224
225
226
 
279
280
281
 
282
283
284
285
286
 
 
287
288
289
290
291
 
292
293
294
 
296
297
298
299
300
 
 
301
302
303
 
318
319
320
321
 
322
323
324
 
462
463
464
 
465
466
467
 
471
472
473
 
 
 
 
 
 
 
 
 
 
474
475
476
 
1
 
2
3
4
5
6
 
29
30
31
 
 
 
32
33
34
35
 
36
37
 
38
39
40
 
90
91
92
 
93
94
95
 
96
97
98
99
100
101
 
113
114
115
 
 
116
117
118
119
 
127
128
129
 
 
 
 
 
 
130
131
132
133
 
135
136
137
 
 
 
138
 
139
140
141
142
 
162
163
164
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
166
167
 
178
179
180
 
181
182
 
 
 
 
 
 
183
184
185
186
187
188
 
 
189
190
191
192
193
194
195
196
 
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
 
264
265
266
267
 
269
270
271
 
 
272
273
274
275
276
 
291
292
293
 
294
295
296
297
 
435
436
437
438
439
440
441
 
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
@@ -1,5 +1,6 @@
 # Creates a task-bar icon. Run from Python.exe to see the -# messages printed. +# messages printed. Takes an optional logfile as first command +# line parameter    import gc  import os @@ -28,16 +29,12 @@
 from tortoisehg.util import thread2, paths, shlib    if hasattr(sys, "frozen"): - # Insert PATH to binary installer gtk directory - gtkpath = os.path.join(paths.bin_path, 'gtk') - os.environ['PATH'] = os.pathsep.join([gtkpath, os.environ['PATH']])   # Give stdout/stderr closed attributes to prevent ui.py errors   sys.stdout.closed = True   sys.stderr.closed = True   -APP_TITLE = _('TortoiseHg RPC server') +APP_TITLE = _('TortoiseHg Overlay Icon Server')   -SHOWLOG_CMD = 1023  EXIT_CMD = 1025    def SetIcon(hwnd, name, add=False): @@ -93,11 +90,12 @@
  0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \   0, 0, hinst, None)   UpdateWindow(self.hwnd) - self.guithread = None   self._DoCreateIcons()     def _DoCreateIcons(self): - SetIcon(self.hwnd, "hg.ico", add=True) + show, highlight = get_config() + if show: + SetIcon(self.hwnd, "hg.ico", add=True)   # start namepipe server for hg status   self.start_pipe_server()   @@ -115,8 +113,7 @@
  def OnTaskbarNotify(self, hwnd, msg, wparam, lparam):   if lparam==win32con.WM_RBUTTONUP or lparam==win32con.WM_LBUTTONUP:   menu = CreatePopupMenu() - AppendMenu(menu, win32con.MF_STRING, SHOWLOG_CMD, _('Options...')) - AppendMenu(menu, win32con.MF_SEPARATOR, 0, '') + # AppendMenu(menu, win32con.MF_SEPARATOR, 0, '')   AppendMenu(menu, win32con.MF_STRING, EXIT_CMD, _('Exit'))   pos = GetCursorPos()   # See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/menus_0hdi.asp @@ -130,12 +127,7 @@
    def OnCommand(self, hwnd, msg, wparam, lparam):   id = LOWORD(wparam) - if id == SHOWLOG_CMD: - if not self.guithread or not self.guithread.isAlive(): - self.launchgui() - else: - print "TortoiseHG options dialog already running" - elif id == EXIT_CMD: + if id == EXIT_CMD:   self.exit_application()   else:   print "Unknown command -", id @@ -143,11 +135,8 @@
  def exit_application(self):   if self.stop_pipe_server():   DestroyWindow(self.hwnd) - if self.guithread and self.guithread.isAlive(): - import gobject - gobject.idle_add(self.dialog.destroy)   print "Goodbye" - +   def stop_pipe_server(self):   print "Stopping pipe server..."   if not self.pipethread.isAlive(): @@ -173,25 +162,6 @@
  else:   return True   - def launchgui(self): - def launch(): - import gtk - # Import hgtk for signal setup side-effects - from tortoisehg.hgtk import hgtk - from tortoisehg.hgtk import taskbarui - dlg = taskbarui.TaskBarUI(logger.getqueue(), requests) - dlg.show_all() - dlg.connect('destroy', gtk.main_quit) - self.dialog = dlg - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - logger.reset() - - self.guithread = thread2.Thread(target=launch) - self.guithread.start() -   def start_pipe_server(self):   def servepipe():   self.svc = PipeServer(self.hwnd) @@ -208,19 +178,19 @@
   class Logger():   def __init__(self): - self.q = None + self.file = None   - def getqueue(self): - self.q = Queue.Queue() - return self.q - - def reset(self): - self.q = None + def setfile(self, name): + self.file = open(name, 'wb') + self.msg('Logging to file started')     def msg(self, msg):   ts = '[%s] ' % time.strftime('%c') - if self.q: - self.q.put(ts + msg) + f = self.file + if f: + f.write(ts + msg + '\n') + f.flush() + os.fsync(f.fileno())   print 'L' + ts + msg   else:   print ts + msg @@ -279,16 +249,19 @@
 requests = Queue.Queue(0)    def get_config(): + show_taskbaricon = True   hgighlight_taskbaricon = True   try:   from _winreg import HKEY_CURRENT_USER, OpenKey, QueryValueEx   hkey = OpenKey(HKEY_CURRENT_USER, r'Software\TortoiseHg')   t = ('1', 'True') + try: show_taskbaricon = QueryValueEx(hkey, 'ShowTaskbarIcon')[0] in t + except EnvironmentError: pass   try: hgighlight_taskbaricon = QueryValueEx(hkey, 'HighlightTaskbarIcon')[0] in t   except EnvironmentError: pass   except (ImportError, WindowsError):   pass - return hgighlight_taskbaricon + return (show_taskbaricon, hgighlight_taskbaricon)    def update(args, hwnd):   batch = [] @@ -296,8 +269,8 @@
  print "got update request %s (first in batch)" % r   batch.append(r)   print "wait a bit for additional requests..." - highlight = get_config() - if highlight: + show, highlight = get_config() + if show and highlight:   SetIcon(hwnd, "hgB.ico")   time.sleep(0.2)   deferred_requests = [] @@ -318,7 +291,7 @@
  msg = "processing batch with %i update requests"   print msg % len(batch)   update_batch(batch) - if highlight: + if show and highlight:   SetIcon(hwnd, "hg.ico")    def remove(args): @@ -462,6 +435,7 @@
 RUNMUTEXNAME = 'thgtaskbar-' + GetUserName()    def main(): + args = sys.argv[1:]   sa = win32security.SECURITY_ATTRIBUTES()   sa.SetSecurityDescriptorDacl(1, None, 0) # allow full access   runmutex = win32event.CreateMutex(sa, 1, RUNMUTEXNAME) @@ -471,6 +445,16 @@
  # see http://www.jrsoftware.org/iskb.php?mutexsessions   installmutex1 = win32event.CreateMutex(sa, 1, INSTALLMUTEXNAME)   installmutex2 = win32event.CreateMutex(sa, 1, 'Global\\' + INSTALLMUTEXNAME) + + logfilename = None + for arg in args: + if arg[0] == '-': + pass + else: + logfilename = arg + if logfilename: + logger.setfile(logfilename) +   w=MainWindow()   PumpMessages()  
 
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
 
88
89
90
91
92
 
 
93
94
95
 
106
107
108
109
110
 
 
 
 
111
112
113
 
9
10
11
 
12
13
14
 
15
16
17
18
19
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
23
24
25
 
65
66
67
 
 
68
69
70
71
72
 
83
84
85
 
 
86
87
88
89
90
91
92
@@ -9,40 +9,17 @@
 import os  import sys  import gtk -import threading  import urllib2    from tortoisehg.util.i18n import _ -from tortoisehg.util import version, paths, hglib +from tortoisehg.util import version, paths, hglib, shlib    from tortoisehg.hgtk import gtklib, hgtk    _verurl = 'http://tortoisehg.bitbucket.org/curversion.txt'   -def browse_url(url): - def start_browser(): - if os.name == 'nt': - import win32api, win32con - win32api.ShellExecute(0, "open", url, None, "", - win32con.SW_SHOW) - elif sys.platform == 'darwin': - # use Mac OS X internet config module (removed in Python 3.0) - import ic - ic.launchurl(url) - else: - try: - import gconf - client = gconf.client_get_default() - browser = client.get_string( - '/desktop/gnome/url-handlers/http/command') + '&' - os.system(browser % url) - except ImportError: - # If gconf is not found, fall back to old standard - os.system('firefox ' + url) - threading.Thread(target=start_browser).start() -  def url_handler(dialog, link, user_data): - browse_url(link) + shlib.browse_url(link)    gtk.about_dialog_set_url_hook(url_handler, None)   @@ -88,8 +65,8 @@
  self.set_name("TortoiseHg")   self.set_version(_("(version %s)") % version.version())   if hasattr(self, 'set_wrap_license'): - self.set_wrap_license(True) - self.set_copyright(_("Copyright 2009 Steve Borho and others")) + self.set_wrap_license(False) + self.set_copyright(_("Copyright 2008-2010 Steve Borho and others"))     thg_logo = paths.get_tortoise_icon('thg_logo_92x50.png')   thg_icon = paths.get_tortoise_icon('thg_logo.ico') @@ -106,8 +83,10 @@
  self.set_license('\n'.join(license))     self.set_comments(_("with %s") % lib_versions + "\n\n" + comment) - self.set_logo(gtk.gdk.pixbuf_new_from_file(thg_logo)) - self.set_icon_from_file(thg_icon) + if thg_logo: + self.set_logo(gtk.gdk.pixbuf_new_from_file(thg_logo)) + if thg_icon: + self.set_icon_from_file(thg_icon)   self.connect('response', self.response)     def response(self, widget, respid):
 
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
 
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
133
134
135
136
 
 
 
 
 
 
 
 
 
 
 
 
137
138
 
139
140
 
141
142
143
 
176
177
178
179
 
180
181
182
 
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
 
263
264
265
 
266
267
268
 
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
 
 
287
288
289
 
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
 
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
 
149
150
151
 
152
153
154
155
 
200
201
202
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
204
205
 
218
219
220
221
222
223
224
 
228
229
230
 
 
 
 
 
 
 
 
 
 
 
 
231
232
233
234
235
@@ -7,62 +7,50 @@
   import os  import gtk -import gobject -import pango   -from mercurial import hg, ui +from mercurial import error    from tortoisehg.util.i18n import _ -from tortoisehg.util import hglib, paths +from tortoisehg.util import hglib   -from tortoisehg.hgtk import hgcmd, gtklib, gdialog +from tortoisehg.hgtk import gtklib, gdialog    WD_PARENT = _('= Working Directory Parent =') -MODE_NORMAL = 'normal' -MODE_WORKING = 'working'   -class ArchiveDialog(gtk.Dialog): +class ArchiveDialog(gdialog.GDialog):   """ Dialog to archive a Mercurial repo """ + def __init__(self, rev=None): + gdialog.GDialog.__init__(self) + self.initrev = rev   - def __init__(self, rev=None): - """ Initialize the Dialog """ - gtk.Dialog.__init__(self) - gtklib.set_tortoise_icon(self, 'menucheckout.ico') - gtklib.set_tortoise_keys(self) - self.set_resizable(False) - self.set_has_separator(False) - self.connect('response', self.dialog_response) + ### Start of Overriding Section ###   - # buttons - self.archivebtn = self.add_button(_('Archive'), gtk.RESPONSE_OK) - self.closebtn = self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) + def get_title(self, reponame): + return _('Archive - %s') % reponame   - try: - repo = hg.repository(ui.ui(), path=paths.find_root()) - except hglib.RepoError: - gtklib.idle_add_single_call(self.destroy) - return - self.repo = repo - self.set_title(_('Archive - %s') % hglib.get_reponame(repo)) + def get_icon(self): + return 'menucheckout.ico' + + def get_body(self, vbox):   self.prevtarget = None     # layout table   self.table = table = gtklib.LayoutTable() - self.vbox.pack_start(table, True, True, 2) + vbox.pack_start(table, True, True, 2)     ## revision combo   self.combo = gtk.combo_box_entry_new_text()   self.combo.child.set_width_chars(28)   self.combo.child.connect('activate',   lambda b: self.response(gtk.RESPONSE_OK)) - if rev: - self.combo.append_text(str(rev)) + if self.initrev: + self.combo.append_text(str(self.initrev))   else:   self.combo.append_text(WD_PARENT)   self.combo.set_active(0) - for b in repo.branchtags(): + for b in self.repo.branchtags():   self.combo.append_text(b) - tags = list(repo.tags()) + tags = list(self.repo.tags())   tags.sort()   tags.reverse()   for t in tags: @@ -94,50 +82,35 @@
  self.uzipradio = add_type(_('Uncompressed zip archive'))   self.zipradio = add_type(_('Zip archive compressed using deflate'))   - # register signal handlers + # signal handler   self.combo.connect('changed', lambda c: self.update_path())     # prepare to show - self.update_path(hglib.toutf(repo.root)) - self.archivebtn.grab_focus() - gtklib.idle_add_single_call(self.after_init) + self.update_path(hglib.toutf(self.repo.root))   - def after_init(self): - # CmdWidget - self.cmd = hgcmd.CmdWidget() - self.cmd.show_all() - self.cmd.hide() - self.vbox.pack_start(self.cmd, True, True, 6) + def get_buttons(self): + return [('archive', _('Archive'), gtk.RESPONSE_OK), + ('close', gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)]   - # abort button - self.abortbtn = self.add_button(_('Abort'), gtk.RESPONSE_CANCEL) - self.abortbtn.hide() + def get_action_map(self): + return {gtk.RESPONSE_OK: self.archive}   - def dialog_response(self, dialog, response_id): - def abort(): - self.cmd.stop() - self.cmd.show_log() - self.switch_to(MODE_NORMAL, cmd=False) - # Archive button - if response_id == gtk.RESPONSE_OK: - self.archive() - # Close button or dialog closing by the user - elif response_id in (gtk.RESPONSE_CLOSE, gtk.RESPONSE_DELETE_EVENT): - if self.cmd.is_alive(): - ret = gdialog.Confirm(_('Confirm Abort'), [], self, - _('Do you want to abort?')).run() - if ret == gtk.RESPONSE_YES: - abort() - else: - self.destroy() - return # close dialog - # Abort button - elif response_id == gtk.RESPONSE_CANCEL: - abort() + def switch_to(self, normal, working, cmd): + self.table.set_sensitive(normal) + self.buttons['archive'].set_property('visible', normal) + self.buttons['close'].set_property('visible', normal) + if normal: + self.buttons['close'].grab_focus() + + def command_done(self, returncode, useraborted, *args): + if returncode == 0: + self.cmd.set_result(_('Archived successfully'), style='ok') + elif useraborted: + self.cmd.set_result(_('Canceled archiving'), style='error')   else: - raise _('unexpected response id: %s') % response_id + self.cmd.set_result(_('Failed to archive'), style='error')   - self.run() # don't close dialog + ### End of Overriding Section ###     def type_changed(self, radio):   if not radio.get_active(): @@ -176,7 +149,7 @@
  else:   try:   self.repo[text] - except (hglib.RepoError, hglib.LookupError): + except (error.RepoError, error.LookupError):   return   if path is None:   path = self.destentry.get_text() @@ -227,24 +200,6 @@
  if response:   self.destentry.set_text(response)   - def switch_to(self, mode, cmd=True): - if mode == MODE_NORMAL: - normal = True - self.closebtn.grab_focus() - elif mode == MODE_WORKING: - normal = False - self.abortbtn.grab_focus() - else: - raise _('unknown mode name: %s') % mode - working = not normal - - self.table.set_sensitive(normal) - self.archivebtn.set_property('visible', normal) - self.closebtn.set_property('visible', normal) - if cmd: - self.cmd.set_property('visible', working) - self.abortbtn.set_property('visible', working) -   def archive(self):   # verify input   type = self.get_selected_archive_type()['type'] @@ -263,6 +218,7 @@
  if ret != gtk.RESPONSE_YES:   return False   + # prepare command line   cmdline = ['hg', 'archive', '--verbose']   rev = self.combo.get_active_text()   if rev != WD_PARENT: @@ -272,18 +228,8 @@
  cmdline.append(type)   cmdline.append(hglib.fromutf(dest))   - def cmd_done(returncode, useraborted): - self.switch_to(MODE_NORMAL, cmd=False) - if returncode == 0: - if not self.cmd.is_show_log(): - self.response(gtk.RESPONSE_CLOSE) - self.cmd.set_result(_('Archived successfully'), style='ok') - elif useraborted: - self.cmd.set_result(_('Canceled archiving'), style='error') - else: - self.cmd.set_result(_('Failed to archive'), style='error') - self.switch_to(MODE_WORKING) - self.cmd.execute(cmdline, cmd_done) + # start archiving + self.execute_command(cmdline)    def run(ui, *pats, **opts):   return ArchiveDialog(opts.get('rev'))
 
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
 
64
65
66
67
 
68
69
70
71
72
73
 
 
74
75
76
 
98
99
100
101
102
103
104
 
 
 
105
106
107
108
109
110
111
 
 
112
113
114
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
117
118
 
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
 
156
157
158
 
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
 
193
194
195
 
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
 
 
 
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
 
54
55
56
 
57
58
59
60
61
62
 
63
64
65
66
67
 
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
 
128
129
130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
132
133
134
 
146
147
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
150
151
152
153
 
155
156
157
 
 
 
 
 
 
 
 
 
 
 
 
158
159
@@ -7,56 +7,46 @@
 # GNU General Public License version 2, incorporated herein by reference.    import gtk -import gobject  import pango   -from mercurial import hg, ui +from tortoisehg.util.i18n import _ +from tortoisehg.util import hglib, i18n   -from tortoisehg.util.i18n import _ -from tortoisehg.util import hglib, paths, i18n, settings - -from tortoisehg.hgtk import csinfo, gtklib, hgcmd, gdialog +from tortoisehg.hgtk import csinfo, gdialog    keep = i18n.keepgettext()   -MODE_NORMAL = 'normal' -MODE_WORKING = 'working' - -class BackoutDialog(gtk.Dialog): +class BackoutDialog(gdialog.GDialog):   """ Backout effect of a changeset """   def __init__(self, rev=None): - """ Initialize the Dialog """ - gtk.Dialog.__init__(self, title=_('Backout changeset - %s') % rev) - gtklib.set_tortoise_icon(self, 'menurevert.ico') - gtklib.set_tortoise_keys(self) - self.set_has_separator(False) - self.set_default_size(600, 400) - self.connect('response', self.dialog_response) + gdialog.GDialog.__init__(self, resizable=True)   self.rev = rev   - # add Backout button - self.backoutbtn = self.add_button(_('Backout'), gtk.RESPONSE_OK) - self.closebtn = self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) + ### Start of Overriding Section ###   - # persistent settings - self.settings = settings.Settings('backout') + def get_title(self, reponame): + return _('Backout changeset - %s') % self.rev   - try: - repo = hg.repository(ui.ui(), path=paths.find_root()) - except hglib.RepoError: - gtklib.idle_add_single_call(self.destroy) - return + def get_icon(self): + return 'menurevert.ico'   + def get_defsize(self): + return (600, 400) + + def get_setting_name(self): + return 'backout' + + def get_body(self, vbox):   # message   self.msgset = keep._('Backed out changeset: ') - self.msgset['id'] += rev - self.msgset['str'] += rev + self.msgset['id'] += self.rev + self.msgset['str'] += self.rev     # changeset info   style = csinfo.panelstyle(label=_('Changeset Description'),   margin=4, padding=2) - self.csetframe = csinfo.create(repo, rev, style, withupdate=True) - self.vbox.pack_start(self.csetframe, False, False, 2) + self.csetframe = csinfo.create(self.repo, self.rev, style, withupdate=True) + vbox.pack_start(self.csetframe, False, False, 2)     # backout commit message   frame = gtk.Frame(_('Backout commit message')) @@ -64,13 +54,14 @@
  msgvbox = gtk.VBox()   msgvbox.set_border_width(4)   frame.add(msgvbox) - self.vbox.pack_start(frame, True, True, 2) + vbox.pack_start(frame, True, True, 2)   self.cmsgframe = frame     ## message text area   self.logview = gtk.TextView(buffer=None)   self.logview.set_editable(True) - self.logview.modify_font(pango.FontDescription('Monospace')) + fontcomment = hglib.getfontconfig()['fontcomment'] + self.logview.modify_font(pango.FontDescription(fontcomment))   self.buf = self.logview.get_buffer()   self.buf.set_text(self.msgset['str'])   scrolledwindow = gtk.ScrolledWindow() @@ -98,21 +89,31 @@
  hbox.pack_start(self.merge_button, False, False, 4)   msgvbox.pack_start(hbox, False, False)   - # prepare to show - self.load_settings() - self.backoutbtn.grab_focus() - gtklib.idle_add_single_call(self.after_init) + def get_buttons(self): + return [('backout', _('Backout'), gtk.RESPONSE_OK), + ('close', gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)]   - def after_init(self): - # CmdWidget - self.cmd = hgcmd.CmdWidget() - self.cmd.show_all() - self.cmd.hide() - self.vbox.pack_start(self.cmd, False, False, 6) + def get_default_button(self): + return 'backout'   - # abort button - self.abortbtn = self.add_button(_('Abort'), gtk.RESPONSE_CANCEL) - self.abortbtn.hide() + def get_action_map(self): + return {gtk.RESPONSE_OK: self.backout} + + def switch_to(self, normal, *args): + self.csetframe.set_sensitive(normal) + self.cmsgframe.set_sensitive(normal) + self.buttons['backout'].set_property('visible', normal) + self.buttons['close'].set_property('visible', normal) + if normal: + self.buttons['close'].grab_focus() + + def command_done(self, returncode, useraborted, *args): + if returncode == 0: + self.cmd.set_result(_('Backed out successfully'), style='ok') + elif useraborted: + self.cmd.set_result(_('Canceled backout'), style='error') + else: + self.cmd.set_result(_('Failed to backout'), style='error')     def load_settings(self):   checked = self.settings.get_value('english', False, True) @@ -127,32 +128,7 @@
  self.settings.set_value('merge', checked)   self.settings.write()   - def dialog_response(self, dialog, response_id): - def abort(): - self.cmd.stop() - self.cmd.show_log() - self.switch_to(MODE_NORMAL, cmd=False) - # Backout button - if response_id == gtk.RESPONSE_OK: - self.backout() - # Close button or dialog closing by the user - elif response_id in (gtk.RESPONSE_CLOSE, gtk.RESPONSE_DELETE_EVENT): - if self.cmd.is_alive(): - ret = gdialog.Confirm(_('Confirm Abort'), [], self, - _('Do you want to abort?')).run() - if ret == gtk.RESPONSE_YES: - abort() - else: - self.store_settings() - self.destroy() - return # close dialog - # Abort button - elif response_id == gtk.RESPONSE_CANCEL: - abort() - else: - raise _('unexpected response id: %s') % response_id - - self.run() # don't close dialog + ### End of Overriding Section ###     def eng_msg_toggled(self, checkbutton):   start, end = self.buf.get_bounds() @@ -170,26 +146,8 @@
  newmsg = (state and self.msgset['id'] or self.msgset['str'])   self.buf.set_text(newmsg)   - def switch_to(self, mode, cmd=True): - if mode == MODE_NORMAL: - normal = True - self.closebtn.grab_focus() - elif mode == MODE_WORKING: - normal = False - self.abortbtn.grab_focus() - else: - raise _('unknown mode name: %s') % mode - working = not normal - - self.csetframe.set_sensitive(normal) - self.cmsgframe.set_sensitive(normal) - self.backoutbtn.set_property('visible', normal) - self.closebtn.set_property('visible', normal) - if cmd: - self.cmd.set_property('visible', working) - self.abortbtn.set_property('visible', working) -   def backout(self): + # prepare command line   start, end = self.buf.get_bounds()   msg = self.buf.get_text(start, end)   cmdline = ['hg', 'backout', '--rev', self.rev] @@ -197,15 +155,5 @@
  cmdline += ['--merge']   cmdline += ['--message', hglib.fromutf(msg)]   - def cmd_done(returncode, useraborted): - self.switch_to(MODE_NORMAL, cmd=False) - if returncode == 0: - if not self.cmd.is_show_log(): - self.response(gtk.RESPONSE_CLOSE) - self.cmd.set_result(_('Backed out successfully'), style='ok') - elif useraborted: - self.cmd.set_result(_('Canceled backout'), style='error') - else: - self.cmd.set_result(_('Failed to backout'), style='error') - self.switch_to(MODE_WORKING) - self.cmd.execute(cmdline, cmd_done) + # start backing out + self.execute_command(cmdline)
Show Entire File tortoisehg/​hgtk/​bookmark.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​browse.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
 
7
8
9
10
11
12
13
14
15
16
17
 
18
19
20
 
32
33
34
35
 
36
37
38
 
7
8
9
 
10
11
12
13
14
15
 
16
17
18
19
 
31
32
33
 
34
35
36
37
@@ -7,14 +7,13 @@
   import os  import gtk -import pango    from mercurial import extensions  from tortoisehg.util.i18n import _  from tortoisehg.util import hglib, version  from tortoisehg.hgtk import gdialog, gtklib   -class BugReport(gdialog.GDialog): +class BugReport(gdialog.GWindow):   """GTK+ based dialog for displaying traceback info to the user in a   cut-paste friendly manner. And include a number of useful bit of   information like version numbers, etc. @@ -32,7 +31,7 @@
  textview = gtk.TextView()   textview.set_wrap_mode(gtk.WRAP_NONE)   textview.set_editable(False) - textview.modify_font(pango.FontDescription(self.fontdiff)) + textview.modify_font(self.fonts['diff'])   scroller = gtk.ScrolledWindow()   scroller.set_shadow_type(gtk.SHADOW_IN)   scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
Show Entire File tortoisehg/​hgtk/​changeset.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​clone.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
 
11
12
13
14
15
16
17
 
26
27
28
29
 
30
31
32
 
39
40
41
42
 
43
44
45
46
 
 
47
48
49
 
56
57
58
59
 
 
 
 
 
60
61
62
 
68
69
70
71
 
72
73
74
 
139
140
141
142
 
143
144
145
 
380
381
382
383
 
384
385
386
 
390
391
392
393
394
 
 
395
396
397
398
 
399
400
401
402
403
 
 
404
405
406
 
477
478
479
480
481
482
483
484
 
 
485
486
487
 
602
603
604
605
 
606
607
608
 
733
734
735
736
 
737
738
739
 
860
861
862
863
864
865
866
867
868
869
870
871
872
 
1037
1038
1039
1040
 
1041
1042
1043
 
11
12
13
 
14
15
16
 
25
26
27
 
28
29
30
31
 
38
39
40
 
41
42
43
 
 
44
45
46
47
48
 
55
56
57
 
58
59
60
61
62
63
64
65
 
71
72
73
 
74
75
76
77
 
142
143
144
 
145
146
147
148
 
383
384
385
 
386
387
388
389
 
393
394
395
 
 
396
397
398
399
400
 
401
402
403
404
 
 
405
406
407
408
409
 
480
481
482
 
 
 
 
 
483
484
485
486
487
 
602
603
604
 
605
606
607
608
 
733
734
735
 
736
737
738
739
 
860
861
862
 
 
 
 
 
 
 
863
864
865
 
1030
1031
1032
 
1033
1034
1035
1036
@@ -11,7 +11,6 @@
 import errno  import gtk  import gobject -import pango  import tempfile  import cStringIO  import time @@ -26,7 +25,7 @@
 from tortoisehg.hgtk import csinfo, gtklib, thgconfig, gdialog, hgcmd    class BranchOperationDialog(gtk.Dialog): - def __init__(self, branch, close, mergebranches): + def __init__(self, branch, close, repo):   gtk.Dialog.__init__(self, parent=None, flags=gtk.DIALOG_MODAL,   buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,   gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), @@ -39,11 +38,11 @@
  self.newbranch = None   self.closebranch = False   - if mergebranches: + if len(repo.parents()) == 2:   lbl = gtk.Label(_('Select branch of merge commit'))   branchcombo = gtk.combo_box_new_text() - for name in mergebranches: - branchcombo.append_text(name) + for p in repo.parents(): + branchcombo.append_text(p.branch())   branchcombo.set_active(0)   self.vbox.pack_start(lbl, True, True, 2)   self.vbox.pack_start(branchcombo, True, True, 2) @@ -56,7 +55,11 @@
  self.newbranchradio = gtk.RadioButton(nochanges,   _('Open a new named branch'))   self.newbranchradio.set_active(True) - self.branchentry = gtk.Entry() + branchcombo = gtk.combo_box_entry_new_text() + for name in hglib.getlivebranch(repo): + branchcombo.append_text(name) + self.branchentry = branchcombo.child +   self.closebranchradio = gtk.RadioButton(nochanges,   _('Close current named branch'))   @@ -68,7 +71,7 @@
  lbl.set_markup(gtklib.markup(_('Changes take effect on next commit'),   weight='bold'))   table.add_row(lbl, padding=False, ypad=6) - table.add_row(self.newbranchradio, self.branchentry) + table.add_row(self.newbranchradio, branchcombo)   table.add_row(self.closebranchradio)   table.add_row(nochanges)   @@ -139,7 +142,7 @@
  def get_help_url(self):   return 'commit.html'   - def set_notify_func(self, func, args): + def set_notify_func(self, func, *args):   self.notify_func = func   self.notify_args = args   @@ -380,7 +383,7 @@
  self.text = gtk.TextView()   self.text.connect('populate-popup', self.msg_add_to_popup)   self.connect('thg-reflow', self.thgreflow, self.text) - self.text.modify_font(pango.FontDescription(self.fontcomment)) + self.text.modify_font(self.fonts['comment'])   scroller.add(self.text)   gtklib.addspellcheck(self.text, self.repo.ui)   @@ -390,17 +393,17 @@
  # parent changeset info   parents_vbox = gtk.VBox(spacing=1)   self.parents_frame = parents_vbox - style = csinfo.labelstyle(contents=(_('Parent: %(rev)s'), - ' %(athead)s', ' %(branch)s', ' %(tags)s', + style = csinfo.labelstyle(contents=('%(athead)s ', + _('Parent: %(rev)s'), ' %(branch)s', ' %(tags)s',   ' %(summary)s'), selectable=True)   def data_func(widget, item, ctx):   if item == 'athead': - return widget.get_data('ishead') or self.mqmode + return widget.get_data('ishead') or bool(self.mqmode)   raise csinfo.UnknownItem(item)   def markup_func(widget, item, value):   if item == 'athead' and value is False: - text = '[%s]' % _('not at head revision') - return gtklib.markup(text, weight='bold') + text = '[%s]' % _('Not at head') + return gtklib.markup(text, weight='bold', color=gtklib.DRED)   raise csinfo.UnknownItem(item)   custom = csinfo.custom(data=data_func, markup=markup_func)   factory = csinfo.factory(self.repo, custom, style) @@ -477,11 +480,8 @@
  liststore.append([sumline, msg])     def branch_clicked(self, button): - if self.is_merge(): - mb = [p.branch() for p in self.repo.parents()] - else: - mb = None - dialog = BranchOperationDialog(self.nextbranch, self.closebranch, mb) + dialog = BranchOperationDialog(self.nextbranch, + self.closebranch, self.repo)   dialog.run()   self.nextbranch = None   self.closebranch = False @@ -602,7 +602,7 @@
  def get_custom_menus(self):   def commit(menuitem, files):   if self.ready_message() and self.isuptodate(): - self.hg_commit(files) + self.commit_selected(files)   self.reload_status()   abs = [self.repo.wjoin(file) for file in files]   shlib.shell_notify(abs) @@ -733,7 +733,7 @@
  self.commit_selected(commit_list)   elif self.qheader is not None:   self.commit_selected([]) - elif self.closebranch: + elif self.closebranch or self.nextbranch:   self.commit_selected([])   else:   gdialog.Prompt(_('Nothing Commited'), @@ -860,13 +860,6 @@
  _('Errors during rollback!'), self).run()     - def changelog_clicked(self, toolbutton, data=None): - from tortoisehg.hgtk import history - dlg = history.run(self.ui) - dlg.display() - return True - -   def should_addremove(self, files):   if self.test_opt('addremove'):   return True @@ -1037,7 +1030,7 @@
  self.msg_cbbox.set_active(-1)   self.last_commit_id = self.get_tip_rev(True)   if self.notify_func: - self.notify_func(self.notify_args) + self.notify_func(*self.notify_args)     def get_tip_rev(self, refresh=False):   if refresh:
Show Entire File tortoisehg/​hgtk/​csinfo.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​cslist.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​datamine.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​gdialog.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​gorev.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​gtklib.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​guess.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​hgcmd.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​hgemail.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​hgignore.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​hginit.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​hgthread.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​hgtk.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​history.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
This file's diff was not loaded because this changeset is very large. Load changes
(No changes)
This file's diff was not loaded because this changeset is very large. Load changes
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​merge.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​p4pending.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​quickop.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​recovery.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​rename.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​serve.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​shellconf.py Stacked
renamed from tortoisehg/hgtk/taskbarui.py
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​status.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​statusbar.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​synch.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​thgconfig.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​thgimport.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​thgmq.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
 
104
105
106
107
 
108
109
110
 
104
105
106
 
107
108
109
110
@@ -104,7 +104,7 @@
  if self.is_merge():   return ()   else: - return ((_('_shelve'), shelve, 'MAR'),) + return ((_('_Shelve'), shelve, 'MAR'),)       def should_live(self, widget=None, event=None):
Show Entire File tortoisehg/​hgtk/​thgstrip.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​update.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​hgtk/​visdiff.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​util/​cachethg.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​util/​hglib.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​util/​hgshelve.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​util/​hgversion.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​util/​menuthg.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​util/​prej.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​util/​shlib.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File tortoisehg/​util/​thread2.py Stacked
This file's diff was not loaded because this changeset is very large. Load changes
This file's diff was not loaded because this changeset is very large. Load changes
This file's diff was not loaded because this changeset is very large. Load changes
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​IconBitmapUtils.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​Makefile Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​Makefile.nmake Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​Registry.cpp Stacked
This file's diff was not loaded because this changeset is very large. Load changes
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​RegistryConfig.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​SysInfo.cpp Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​SysInfo.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​ThgDebug.cpp Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​Thgstatus.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes
This file's diff was not loaded because this changeset is very large. Load changes
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​TortoiseUtils.cpp Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​TortoiseUtils.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​auto_buffer.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​registry.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​resource.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​terminate.cpp Stacked
This file's diff was not loaded because this changeset is very large. Load changes
Show Entire File win32/​shellext/​tstring.h Stacked
This file's diff was not loaded because this changeset is very large. Load changes