merge with stable
authorMatt Mackall <mpm@selenic.com>
Mon, 09 Nov 2015 12:49:21 -0600
changeset 26885 8b2fbe3f59b1
parent 26879 a24b98f4e03c (current diff)
parent 26884 762bf510b42c (diff)
child 26892 4b966aaadc45
merge with stable
mercurial/posix.py
--- a/hgext/clonebundles.py	Thu Nov 05 17:30:10 2015 -0600
+++ b/hgext/clonebundles.py	Mon Nov 09 12:49:21 2015 -0600
@@ -57,7 +57,7 @@
 static file hosting services are simple and scalable and should be sufficient
 for most needs.
 
-Bundle files can be generated with the :hg:`bundle` comand. Typically
+Bundle files can be generated with the :hg:`bundle` command. Typically
 :hg:`bundle --all` is used to produce a bundle of the entire repository.
 
 :hg:`debugcreatestreamclonebundle` can be used to produce a special
--- a/mercurial/changegroup.py	Thu Nov 05 17:30:10 2015 -0600
+++ b/mercurial/changegroup.py	Mon Nov 09 12:49:21 2015 -0600
@@ -322,20 +322,20 @@
         changesets = files = revisions = 0
 
         tr = repo.transaction("\n".join([srctype, util.hidepassword(url)]))
-        # The transaction could have been created before and already
-        # carries source information. In this case we use the top
-        # level data. We overwrite the argument because we need to use
-        # the top level value (if they exist) in this function.
-        srctype = tr.hookargs.setdefault('source', srctype)
-        url = tr.hookargs.setdefault('url', url)
+        try:
+            # The transaction could have been created before and already
+            # carries source information. In this case we use the top
+            # level data. We overwrite the argument because we need to use
+            # the top level value (if they exist) in this function.
+            srctype = tr.hookargs.setdefault('source', srctype)
+            url = tr.hookargs.setdefault('url', url)
+            repo.hook('prechangegroup', throw=True, **tr.hookargs)
 
-        # write changelog data to temp files so concurrent readers will not see
-        # inconsistent view
-        cl = repo.changelog
-        cl.delayupdate(tr)
-        oldheads = cl.heads()
-        try:
-            repo.hook('prechangegroup', throw=True, **tr.hookargs)
+            # write changelog data to temp files so concurrent readers
+            # will not see an inconsistent view
+            cl = repo.changelog
+            cl.delayupdate(tr)
+            oldheads = cl.heads()
 
             trp = weakref.proxy(tr)
             # pull off the changeset group
@@ -406,10 +406,6 @@
                              % (changesets, revisions, files, htext))
             repo.invalidatevolatilesets()
 
-            # Call delayupdate again to ensure the transaction writepending
-            # subscriptions are still in place.
-            cl.delayupdate(tr)
-
             if changesets > 0:
                 if 'node' not in tr.hookargs:
                     tr.hookargs['node'] = hex(cl.node(clstart))
--- a/mercurial/demandimport.py	Thu Nov 05 17:30:10 2015 -0600
+++ b/mercurial/demandimport.py	Mon Nov 09 12:49:21 2015 -0600
@@ -164,7 +164,7 @@
         # The name of the module the import statement is located in.
         globalname = globals.get('__name__')
 
-        def processfromitem(mod, attr, **kwargs):
+        def processfromitem(mod, attr):
             """Process an imported symbol in the import statement.
 
             If the symbol doesn't exist in the parent module, it must be a
@@ -172,7 +172,7 @@
             """
             symbol = getattr(mod, attr, nothing)
             if symbol is nothing:
-                symbol = _demandmod(attr, mod.__dict__, locals, **kwargs)
+                symbol = _demandmod(attr, mod.__dict__, locals, level=1)
                 setattr(mod, attr, symbol)
 
             # Record the importing module references this symbol so we can
@@ -194,7 +194,7 @@
             mod = _hgextimport(_origimport, name, globals, locals, level=level)
 
             for x in fromlist:
-                processfromitem(mod, x, level=level)
+                processfromitem(mod, x)
 
             return mod
 
--- a/mercurial/hook.py	Thu Nov 05 17:30:10 2015 -0600
+++ b/mercurial/hook.py	Mon Nov 09 12:49:21 2015 -0600
@@ -122,8 +122,7 @@
     # make in-memory changes visible to external process
     tr = repo.currenttransaction()
     repo.dirstate.write(tr)
-    if tr:
-        tr.writepending()
+    if tr and tr.writepending():
         env['HG_PENDING'] = repo.root
 
     for k, v in args.iteritems():
--- a/mercurial/parsers.c	Thu Nov 05 17:30:10 2015 -0600
+++ b/mercurial/parsers.c	Mon Nov 09 12:49:21 2015 -0600
@@ -2692,7 +2692,7 @@
 
 static PyObject *fm1readmarkers(PyObject *self, PyObject *args) {
 	const char *data, *dataend;
-	Py_ssize_t datalen;
+	int datalen;
 	Py_ssize_t offset, stop;
 	PyObject *markers = NULL;
 
--- a/mercurial/posix.py	Thu Nov 05 17:30:10 2015 -0600
+++ b/mercurial/posix.py	Mon Nov 09 12:49:21 2015 -0600
@@ -170,22 +170,26 @@
     """check whether the given path is on a symlink-capable filesystem"""
     # mktemp is not racy because symlink creation will fail if the
     # file already exists
-    name = tempfile.mktemp(dir=path, prefix='hg-checklink-')
-    try:
-        fd = tempfile.NamedTemporaryFile(dir=path, prefix='hg-checklink-')
+    while True:
+        name = tempfile.mktemp(dir=path, prefix='hg-checklink-')
         try:
-            os.symlink(os.path.basename(fd.name), name)
-            os.unlink(name)
-            return True
-        finally:
-            fd.close()
-    except AttributeError:
-        return False
-    except OSError as inst:
-        # sshfs might report failure while successfully creating the link
-        if inst[0] == errno.EIO and os.path.exists(name):
-            os.unlink(name)
-        return False
+            fd = tempfile.NamedTemporaryFile(dir=path, prefix='hg-checklink-')
+            try:
+                os.symlink(os.path.basename(fd.name), name)
+                os.unlink(name)
+                return True
+            except OSError as inst:
+                # link creation might race, try again
+                if inst[0] == errno.EEXIST:
+                    continue
+                # sshfs might report failure while successfully creating the link
+                if inst[0] == errno.EIO and os.path.exists(name):
+                    os.unlink(name)
+                return False
+            finally:
+                fd.close()
+        except AttributeError:
+            return False
 
 def checkosfilename(path):
     '''Check that the base-relative path is a valid filename on this platform.
--- a/tests/test-hook.t	Thu Nov 05 17:30:10 2015 -0600
+++ b/tests/test-hook.t	Mon Nov 09 12:49:21 2015 -0600
@@ -113,7 +113,7 @@
   $ hg pull ../a
   pulling from ../a
   searching for changes
-  prechangegroup hook: HG_PENDING=$TESTTMP/b HG_SOURCE=pull HG_TXNID=TXN:* HG_URL=file:$TESTTMP/a (glob)
+  prechangegroup hook: HG_SOURCE=pull HG_TXNID=TXN:* HG_URL=file:$TESTTMP/a (glob)
   adding changesets
   adding manifests
   adding file changes
@@ -272,7 +272,7 @@
   listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
   no changes found
   pretxnopen hook: HG_TXNID=TXN:* HG_TXNNAME=push (glob)
-  prepushkey.forbid hook: HG_BUNDLE2=1 HG_KEY=baz HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_PENDING=$TESTTMP/a HG_SOURCE=push HG_TXNID=TXN:* HG_URL=push (glob)
+  prepushkey.forbid hook: HG_BUNDLE2=1 HG_KEY=baz HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_SOURCE=push HG_TXNID=TXN:* HG_URL=push (glob)
   pushkey-abort: prepushkey hook exited with status 1
   abort: exporting bookmark baz failed!
   [255]
@@ -306,7 +306,7 @@
   $ hg pull ../a
   pulling from ../a
   searching for changes
-  prechangegroup.forbid hook: HG_PENDING=$TESTTMP/b HG_SOURCE=pull HG_TXNID=TXN:* HG_URL=file:$TESTTMP/a (glob)
+  prechangegroup.forbid hook: HG_SOURCE=pull HG_TXNID=TXN:* HG_URL=file:$TESTTMP/a (glob)
   abort: prechangegroup.forbid hook exited with status 1
   [255]