# HG changeset patch # User Matt Mackall # Date 1177868004 18000 # Node ID 6186b6cba8ea1fcee0116090e63cc3bec3e28234 # Parent 80c7fa620a4dbdfabd8f92e837d911e04cfb61fb# Parent f9cd48bd8625b0f0837e7a37a1cba4db310cad4e Merge with crew diff -r 80c7fa620a4d -r 6186b6cba8ea contrib/win32/ReadMe.html --- a/contrib/win32/ReadMe.html Thu Apr 26 18:41:18 2007 -0500 +++ b/contrib/win32/ReadMe.html Sun Apr 29 12:33:24 2007 -0500 @@ -46,14 +46,21 @@ other Mercurial commands should work fine for you.

Configuration notes

-

The default editor for commit messages is 'notepad'. You can set the EDITOR +

Default editor

+ The default editor for commit messages is 'notepad'. You can set the EDITOR (or HGEDITOR) environment variable to specify your preference or set it in - mercurial.ini:

+ mercurial.ini:
 [ui]
 editor = whatever
 
+

Configuring a Merge program

+ It should be emphasized that Mercurial by itself doesn't attempt to do a + Merge at the file level, neither does it make any attempt to Resolve the conflicts. + + By default, Mercurial will use the merge program defined by the HGMERGE environment + variable, or uses the one defined in the mercurial.ini file. (see MergeProgram on the Mercurial Wiki for more information)

Reporting problems

diff -r 80c7fa620a4d -r 6186b6cba8ea contrib/win32/mercurial.iss --- a/contrib/win32/mercurial.iss Thu Apr 26 18:41:18 2007 -0500 +++ b/contrib/win32/mercurial.iss Sun Apr 29 12:33:24 2007 -0500 @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] -AppCopyright=Copyright 2005, 2006 Matt Mackall and others +AppCopyright=Copyright 2005-2007 Matt Mackall and others AppName=Mercurial AppVerName=Mercurial snapshot InfoAfterFile=contrib/win32/postinstall.txt @@ -18,7 +18,7 @@ DefaultDirName={sd}\Mercurial SourceDir=C:\hg\hg-release VersionInfoDescription=Mercurial distributed SCM -VersionInfoCopyright=Copyright 2005, 2006 Matt Mackall and others +VersionInfoCopyright=Copyright 2005-2007 Matt Mackall and others VersionInfoCompany=Matt Mackall and others InternalCompressLevel=max SolidCompression=true diff -r 80c7fa620a4d -r 6186b6cba8ea mercurial/cmdutil.py --- a/mercurial/cmdutil.py Thu Apr 26 18:41:18 2007 -0500 +++ b/mercurial/cmdutil.py Sun Apr 29 12:33:24 2007 -0500 @@ -200,6 +200,50 @@ if not dry_run: repo.copy(old, new, wlock=wlock) +def service(opts, parentfn=None, initfn=None, runfn=None): + '''Run a command as a service.''' + + if opts['daemon'] and not opts['daemon_pipefds']: + rfd, wfd = os.pipe() + args = sys.argv[:] + args.append('--daemon-pipefds=%d,%d' % (rfd, wfd)) + pid = os.spawnvp(os.P_NOWAIT | getattr(os, 'P_DETACH', 0), + args[0], args) + os.close(wfd) + os.read(rfd, 1) + if parentfn: + return parentfn(pid) + else: + os._exit(0) + + if initfn: + initfn() + + if opts['pid_file']: + fp = open(opts['pid_file'], 'w') + fp.write(str(os.getpid()) + '\n') + fp.close() + + if opts['daemon_pipefds']: + rfd, wfd = [int(x) for x in opts['daemon_pipefds'].split(',')] + os.close(rfd) + try: + os.setsid() + except AttributeError: + pass + os.write(wfd, 'y') + os.close(wfd) + sys.stdout.flush() + sys.stderr.flush() + fd = os.open(util.nulldev, os.O_RDWR) + if fd != 0: os.dup2(fd, 0) + if fd != 1: os.dup2(fd, 1) + if fd != 2: os.dup2(fd, 2) + if fd not in (0, 1, 2): os.close(fd) + + if runfn: + return runfn() + class changeset_printer(object): '''show changeset information when templating not requested.''' diff -r 80c7fa620a4d -r 6186b6cba8ea mercurial/commands.py --- a/mercurial/commands.py Thu Apr 26 18:41:18 2007 -0500 +++ b/mercurial/commands.py Sun Apr 29 12:33:24 2007 -0500 @@ -891,27 +891,28 @@ # actually attempt a patch here a = "1\n2\n3\n4\n" b = "1\n2\n3\ninsert\n4\n" - d = mdiff.unidiff(a, None, b, None, "a") fa = writetemp(a) + d = mdiff.unidiff(a, None, b, None, os.path.basename(fa)) fd = writetemp(d) - fp = os.popen('%s %s %s' % (patcher, fa, fd)) - files = [] - output = "" - for line in fp: - output += line - if line.startswith('patching file '): - pf = util.parse_patch_output(line.rstrip()) - files.append(pf) - if files != [fa]: - ui.write(_(" unexpected patch output!")) - ui.write(_(" (you may have an incompatible version of patch)\n")) - ui.write(output) + + files = {} + try: + patch.patch(fd, ui, cwd=os.path.dirname(fa), files=files) + except util.Abort, e: + ui.write(_(" patch call failed:\n")) + ui.write(" " + str(e) + "\n") problems += 1 - a = file(fa).read() - if a != b: - ui.write(_(" patch test failed!")) - ui.write(_(" (you may have an incompatible version of patch)\n")) - problems += 1 + else: + if list(files) != [os.path.basename(fa)]: + ui.write(_(" unexpected patch output!")) + ui.write(_(" (you may have an incompatible version of patch)\n")) + problems += 1 + a = file(fa).read() + if a != b: + ui.write(_(" patch test failed!")) + ui.write(_(" (you may have an incompatible version of patch)\n")) + problems += 1 + os.unlink(fa) os.unlink(fd) @@ -1550,7 +1551,7 @@ p2 = repo.lookup(p2) if p1 == wp[0].node(): repo.dirstate.setparents(p1, p2) - except RepoError: + except hg.RepoError: pass files = {} @@ -2375,44 +2376,27 @@ raise hg.RepoError(_("There is no Mercurial repository here" " (.hg not found)")) - if opts['daemon'] and not opts['daemon_pipefds']: - rfd, wfd = os.pipe() - args = sys.argv[:] - args.append('--daemon-pipefds=%d,%d' % (rfd, wfd)) - pid = os.spawnvp(os.P_NOWAIT | getattr(os, 'P_DETACH', 0), - args[0], args) - os.close(wfd) - os.read(rfd, 1) - os._exit(0) - - httpd = hgweb.server.create_server(parentui, repo) - - if ui.verbose: - if httpd.port != 80: - ui.status(_('listening at http://%s:%d/\n') % - (httpd.addr, httpd.port)) - else: - ui.status(_('listening at http://%s/\n') % httpd.addr) - - if opts['pid_file']: - fp = open(opts['pid_file'], 'w') - fp.write(str(os.getpid()) + '\n') - fp.close() - - if opts['daemon_pipefds']: - rfd, wfd = [int(x) for x in opts['daemon_pipefds'].split(',')] - os.close(rfd) - os.write(wfd, 'y') - os.close(wfd) - sys.stdout.flush() - sys.stderr.flush() - fd = os.open(util.nulldev, os.O_RDWR) - if fd != 0: os.dup2(fd, 0) - if fd != 1: os.dup2(fd, 1) - if fd != 2: os.dup2(fd, 2) - if fd not in (0, 1, 2): os.close(fd) - - httpd.serve_forever() + class service: + def init(self): + try: + self.httpd = hgweb.server.create_server(parentui, repo) + except socket.error, inst: + raise util.Abort(_('cannot start server: ') + inst.args[1]) + + if not ui.verbose: return + + if httpd.port != 80: + ui.status(_('listening at http://%s:%d/\n') % + (httpd.addr, httpd.port)) + else: + ui.status(_('listening at http://%s/\n') % httpd.addr) + + def run(self): + self.httpd.serve_forever() + + service = service() + + cmdutil.service(opts, initfn=service.init, runfn=service.run) def status(ui, repo, *pats, **opts): """show changed files in the working directory diff -r 80c7fa620a4d -r 6186b6cba8ea mercurial/util.py --- a/mercurial/util.py Thu Apr 26 18:41:18 2007 -0500 +++ b/mercurial/util.py Sun Apr 29 12:33:24 2007 -0500 @@ -764,9 +764,6 @@ except: return True -_umask = os.umask(0) -os.umask(_umask) - def checkexec(path): """ Check whether the given path is on a filesystem with UNIX-like exec flags diff -r 80c7fa620a4d -r 6186b6cba8ea mercurial/util_win32.py --- a/mercurial/util_win32.py Thu Apr 26 18:41:18 2007 -0500 +++ b/mercurial/util_win32.py Sun Apr 29 12:33:24 2007 -0500 @@ -297,5 +297,30 @@ win32file.SetEndOfFile(self.handle) except pywintypes.error, err: raise WinIOError(err) + +def find_in_path(name, path, default=None): + '''find name in search path. path can be string (will be split + with os.pathsep), or iterable thing that returns strings. if name + found, return path to name. else return default. name is looked up + using cmd.exe rules, using PATHEXT.''' + if isinstance(path, str): + path = path.split(os.pathsep) + + pathext = os.environ.get('PATHEXT', '.COM;.EXE;.BAT;.CMD') + pathext = pathext.lower().split(os.pathsep) + isexec = os.path.splitext(name)[1].lower() in pathext + + for p in path: + p_name = os.path.join(p, name) + + if isexec and os.path.exists(p_name): + return p_name + + for ext in pathext: + p_name_ext = p_name + ext + if os.path.exists(p_name_ext): + return p_name_ext + + return default getuser_fallback = win32api.GetUserName diff -r 80c7fa620a4d -r 6186b6cba8ea tests/run-tests.py --- a/tests/run-tests.py Thu Apr 26 18:41:18 2007 -0500 +++ b/tests/run-tests.py Sun Apr 29 12:33:24 2007 -0500 @@ -346,8 +346,9 @@ HGRCPATH = os.environ["HGRCPATH"] = os.path.join(HGTMP, '.hgrc') os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"' -os.environ["HGMERGE"] = 'python "%s"' % os.path.join(TESTDIR, os.path.pardir, - 'contrib', 'simplemerge') +os.environ["HGMERGE"] = ('python "%s" -L my -L other' + % os.path.join(TESTDIR, os.path.pardir, 'contrib', + 'simplemerge')) os.environ["HGUSER"] = "test" os.environ["HGENCODING"] = "ascii" os.environ["HGENCODINGMODE"] = "strict" diff -r 80c7fa620a4d -r 6186b6cba8ea tests/test-conflict --- a/tests/test-conflict Thu Apr 26 18:41:18 2007 -0500 +++ b/tests/test-conflict Sun Apr 29 12:33:24 2007 -0500 @@ -11,5 +11,5 @@ hg commit -m branch2 -d "1000000 0" hg merge 1 hg id -egrep -v ">>>|<<<" a +cat a hg status diff -r 80c7fa620a4d -r 6186b6cba8ea tests/test-conflict.out --- a/tests/test-conflict.out Thu Apr 26 18:41:18 2007 -0500 +++ b/tests/test-conflict.out Sun Apr 29 12:33:24 2007 -0500 @@ -7,7 +7,9 @@ hg update -C 2 hg merge 1 e7fe8eb3e180+0d24b7662d3e+ tip +<<<<<<< my something else ======= something +>>>>>>> other M a diff -r 80c7fa620a4d -r 6186b6cba8ea tests/test-merge-revert2 --- a/tests/test-merge-revert2 Thu Apr 26 18:41:18 2007 -0500 +++ b/tests/test-merge-revert2 Sun Apr 29 12:33:24 2007 -0500 @@ -27,7 +27,7 @@ hg update -C 0 echo "changed file1 different" >> file1 hg update -hg diff --nodates | sed -e "s/\(<<<<<<<\) .*/\1/" -e "s/\(>>>>>>>\) .*/\1/" +hg diff --nodates hg status hg id hg revert --no-backup --all diff -r 80c7fa620a4d -r 6186b6cba8ea tests/test-merge-revert2.out --- a/tests/test-merge-revert2.out Thu Apr 26 18:41:18 2007 -0500 +++ b/tests/test-merge-revert2.out Sun Apr 29 12:33:24 2007 -0500 @@ -23,11 +23,11 @@ @@ -1,3 +1,7 @@ added file1 added file1 another line of text -+<<<<<<< ++<<<<<<< my +changed file1 different +======= changed file1 -+>>>>>>> ++>>>>>>> other M file1 f248da0d4c3e+ tip reverting file1 diff -r 80c7fa620a4d -r 6186b6cba8ea tests/test-merge7 --- a/tests/test-merge7 Thu Apr 26 18:41:18 2007 -0500 +++ b/tests/test-merge7 Sun Apr 29 12:33:24 2007 -0500 @@ -59,7 +59,7 @@ hg pull ../test-a hg merge --debug -cat test.txt | sed "s% .*%%" +cat test.txt hg debugindex .hg/store/data/test.txt.i diff -r 80c7fa620a4d -r 6186b6cba8ea tests/test-merge7.out --- a/tests/test-merge7.out Thu Apr 26 18:41:18 2007 -0500 +++ b/tests/test-merge7.out Sun Apr 29 12:33:24 2007 -0500 @@ -33,11 +33,11 @@ hg update -C 3 hg merge 4 one -<<<<<<< +<<<<<<< my two-point-five ======= two-point-one ->>>>>>> +>>>>>>> other three rev offset length base linkrev nodeid p1 p2 0 0 7 0 0 01365c4cca56 000000000000 000000000000