# HG changeset patch # User mpm@selenic.com # Date 1124232827 28800 # Node ID 7f3f55903496afd5e82ea631c0a9a0828c872297 # Parent fe094cca9915962e5389b56bc7f21eb1933c1910 Fix hg clone race with writer Most read operations in hg don't need locks because we order reads and writes for consistency. Clone is an exception to this as we're copying entire file histories and could end up with more file history copied than we have commits. For now, make clone take a lock on the source repo. Non-hardlinked clone should eventually be changed to use lockless pull. diff -r fe094cca9915 -r 7f3f55903496 mercurial/commands.py --- a/mercurial/commands.py Tue Aug 16 14:17:27 2005 -0800 +++ b/mercurial/commands.py Tue Aug 16 14:53:47 2005 -0800 @@ -7,7 +7,7 @@ from demandload import demandload demandload(globals(), "os re sys signal shutil") -demandload(globals(), "fancyopts ui hg util") +demandload(globals(), "fancyopts ui hg util lock") demandload(globals(), "fnmatch hgweb mdiff random signal time traceback") demandload(globals(), "errno socket version struct atexit") @@ -494,6 +494,9 @@ and getattr(os, 'link', None) or shutil.copy2) if copyfile is not shutil.copy2: ui.note("cloning by hardlink\n") + # we use a lock here because because we're not nicely ordered + l = lock.lock(os.path.join(source, ".hg", "lock")) + util.copytree(os.path.join(source, ".hg"), os.path.join(dest, ".hg"), copyfile) try: diff -r fe094cca9915 -r 7f3f55903496 mercurial/util.py --- a/mercurial/util.py Tue Aug 16 14:17:27 2005 -0800 +++ b/mercurial/util.py Tue Aug 16 14:53:47 2005 -0800 @@ -187,7 +187,7 @@ elif os.path.isfile(srcname): copyfile(srcname, dstname) else: - raise IOError("Not a regular file: %r" % srcname) + pass def _makelock_file(info, pathname): ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)