# HG changeset patch # User Matt Mackall # Date 1177868004 18000 # Node ID 6186b6cba8ea1fcee0116090e63cc3bec3e28234 # Parent 80c7fa620a4dbdfabd8f92e837d911e04cfb61fb# Parent f9cd48bd8625b0f0837e7a37a1cba4db310cad4e Merge with crew diff --git a/contrib/win32/ReadMe.html b/contrib/win32/ReadMe.html --- a/contrib/win32/ReadMe.html +++ b/contrib/win32/ReadMe.html @@ -46,14 +46,21 @@ hg 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 --git a/contrib/win32/mercurial.iss b/contrib/win32/mercurial.iss --- a/contrib/win32/mercurial.iss +++ b/contrib/win32/mercurial.iss @@ -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 @@ OutputBaseFilename=Mercurial-snapshot 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 --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -200,6 +200,50 @@ def addremove(repo, pats=[], opts={}, wl 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 --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -891,27 +891,28 @@ def debuginstall(ui): # 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 @@ def import_(ui, repo, patch1, *patches, 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 @@ def serve(ui, repo, **opts): 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 --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -764,9 +764,6 @@ def checkfolding(path): 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 --git a/mercurial/util_win32.py b/mercurial/util_win32.py --- a/mercurial/util_win32.py +++ b/mercurial/util_win32.py @@ -297,5 +297,30 @@ class posixfile_nt(object): 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 --git a/tests/run-tests.py b/tests/run-tests.py --- a/tests/run-tests.py +++ b/tests/run-tests.py @@ -346,8 +346,9 @@ DAEMON_PIDS = os.environ["DAEMON_PIDS"] 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 --git a/tests/test-conflict b/tests/test-conflict --- a/tests/test-conflict +++ b/tests/test-conflict @@ -11,5 +11,5 @@ echo "something else" > a hg commit -m branch2 -d "1000000 0" hg merge 1 hg id -egrep -v ">>>|<<<" a +cat a hg status diff --git a/tests/test-conflict.out b/tests/test-conflict.out --- a/tests/test-conflict.out +++ b/tests/test-conflict.out @@ -7,7 +7,9 @@ There are unresolved merges, you can red hg update -C 2 hg merge 1 e7fe8eb3e180+0d24b7662d3e+ tip +<<<<<<< my something else ======= something +>>>>>>> other M a diff --git a/tests/test-merge-revert2 b/tests/test-merge-revert2 --- a/tests/test-merge-revert2 +++ b/tests/test-merge-revert2 @@ -27,7 +27,7 @@ hg id 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 --git a/tests/test-merge-revert2.out b/tests/test-merge-revert2.out --- a/tests/test-merge-revert2.out +++ b/tests/test-merge-revert2.out @@ -23,11 +23,11 @@ diff -r f248da0d4c3e file1 @@ -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 --git a/tests/test-merge7 b/tests/test-merge7 --- a/tests/test-merge7 +++ b/tests/test-merge7 @@ -59,7 +59,7 @@ cd ../test-b hg pull ../test-a hg merge --debug -cat test.txt | sed "s% .*%%" +cat test.txt hg debugindex .hg/store/data/test.txt.i diff --git a/tests/test-merge7.out b/tests/test-merge7.out --- a/tests/test-merge7.out +++ b/tests/test-merge7.out @@ -33,11 +33,11 @@ There are unresolved merges, you can red 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