by
Changes to 102 files · Browse files at de0251c7291e Showing diff from parent 355f22331d2e fbf42262c763 Diff from another changeset...
@@ -15,3 +15,8 @@ below.
PyGtk: 2.10
+
+=== Python version ===
+
+TortoiseHg needs to run on Python 2.4, to stay consistent with Mercurial
+itself.
|
|
@@ -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,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
|
|
@@ -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()
|
|
|
@@ -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,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,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
|
|
@@ -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 +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);
|
@@ -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.
|
@@ -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,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,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,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,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,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?*
|
|
@@ -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
^^^^^^^^^^^^^^^^^
|
|
|
@@ -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,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,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,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
-----------------
|
|
|
|
|
@@ -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',
|
|
|
@@ -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,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,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,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)
|
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
@@ -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)
|
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
|
|
@@ -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:
|
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
@@ -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):
|
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
This file's diff was not loaded because this changeset is very large. Load changes Loading... |
Loading...