merge with stable
authorMatt Mackall <mpm@selenic.com>
Tue, 03 May 2016 10:41:17 -0500
changeset 29054 acc4c6070f31
parent 28976 9fb2e8c8f320 (current diff)
parent 29053 61463b8fcef8 (diff)
child 29055 4a65c9c6cd3f
merge with stable
contrib/docker/ubuntu-trusty
--- a/.hgignore	Fri Apr 15 13:10:34 2016 -0700
+++ b/.hgignore	Tue May 03 10:41:17 2016 -0500
@@ -30,6 +30,7 @@
 contrib/chg/chg
 contrib/hgsh/hgsh
 contrib/vagrant/.vagrant
+contrib/docker/ubuntu-*
 dist
 packages
 doc/common.txt
--- a/.hgsigs	Fri Apr 15 13:10:34 2016 -0700
+++ b/.hgsigs	Tue May 03 10:41:17 2016 -0500
@@ -123,3 +123,6 @@
 b698abf971e7377d9b7ec7fc8c52df45255b0329 0 iQIVAwUAVrJ4YCBXgaxoKi1yAQJsKw/+JHSR0bIyarO4/VilFwsYxCprOnPxmUdS4qc4yjvpbf7Dqqr/OnOHJA29LrMoqWqsHgREepemjqiNindwNtlZec+KgmbF08ihSBBpls96UTTYTcytKRkkbrB+FhwB0iDl/o8RgGPniyG6M7gOp6p8pXQVRCOToIY1B/G0rtpkcU1N3GbiZntO5Fm/LPAVIE74VaDsamMopQ/wEB8qiERngX/M8SjO1ZSaVNW6KjRUsarLXQB9ziVJBolK/WnQsDwEeuWU2udpjBiOHnFC6h84uBpc8rLGhr419bKMJcjgl+0sl2zHGPY2edQYuJqVjVENzf4zzZA+xPgKw3GrSTpd37PEnGU/fufdJ0X+pp3kvmO1cV3TsvVMTCn7NvS6+w8SGdHdwKQQwelYI6vmJnjuOCATbafJiHMaOQ0GVYYk6PPoGrYcQ081x6dStCMaHIPOV1Wirwd2wq+SN9Ql8H6njftBf5Sa5tVWdW/zrhsltMsdZYZagZ/oFT3t83exL0rgZ96bZFs0j3HO3APELygIVuQ6ybPsFyToMDbURNDvr7ZqPKhQkkdHIUMqEez5ReuVgpbO9CWV/yWpB1/ZCpjNBZyDvw05kG2mOoC7AbHc8aLUS/8DetAmhwyb48LW4qjfUkO7RyxVSxqdnaBOMlsg1wsP2S+SlkZKsDHjcquZJ5U=
 d493d64757eb45ada99fcb3693e479a51b7782da 0 iQIVAwUAVtYt4SBXgaxoKi1yAQL6TQ/9FzYE/xOSC2LYqPdPjCXNjGuZdN1WMf/8fUMYT83NNOoLEBGx37C0bAxgD4/P03FwYMuP37IjIcX8vN6fWvtG9Oo0o2n/oR3SKjpsheh2zxhAFX3vXhFD4U18wCz/DnM0O1qGJwJ49kk/99WNgDWeW4n9dMzTFpcaeZBCu1REbZQS40Z+ArXTDCr60g5TLN1XR1WKEzQJvF71rvaE6P8d3GLoGobTIJMLi5UnMwGsnsv2/EIPrWHQiAY9ZEnYq6deU/4RMh9c7afZie9I+ycIA/qVH6vXNt3/a2BP3Frmv8IvKPzqwnoWmIUamew9lLf1joD5joBy8Yu+qMW0/s6DYUGQ4Slk9qIfn6wh4ySgT/7FJUMcayx9ONDq7920RjRc+XFpD8B3Zhj2mM+0g9At1FgX2w2Gkf957oz2nlgTVh9sdPvP6UvWzhqszPMpdG5Vt0oc5vuyobW333qSkufCxi5gmH7do1DIzErMcy8b6IpZUDeQ/dakKwLQpZVVPF15IrNa/zsOW55SrGrL8/ErM/mXNQBBAqvRsOLq2njFqK2JaoG6biH21DMjHVZFw2wBRoLQxbOppfz2/e3mNkNy9HjgJTW3+0iHWvRzMSjwRbk9BlbkmH6kG5163ElHq3Ft3uuQyZBL9I5SQxlHi9s/CV0YSTYthpWR3ChKIMoqBQ0=
 ae279d4a19e9683214cbd1fe8298cf0b50571432 0 iQIVAwUAVvqzViBXgaxoKi1yAQKUCxAAtctMD3ydbe+li3iYjhY5qT0wyHwPr9fcLqsQUJ4ZtD4sK3oxCRZFWFxNBk5bIIyiwusSEJPiPddoQ7NljSZlYDI0HR3R4vns55fmDwPG07Ykf7aSyqr+c2ppCGzn2/2ID476FNtzKqjF+LkVyadgI9vgZk5S4BgdSlfSRBL+1KtB1BlF5etIZnc5U9qs1uqzZJc06xyyF8HlrmMZkAvRUbsx/JzA5LgzZ2WzueaxZgYzYjDk0nPLgyPPBj0DVyWXnW/kdRNmKHNbaZ9aZlWmdPCEoq5iBm71d7Xoa61shmeuVZWvxHNqXdjVMHVeT61cRxjdfxTIkJwvlRGwpy7V17vTgzWFxw6QJpmr7kupRo3idsDydLDPHGUsxP3uMZFsp6+4rEe6qbafjNajkRyiw7kVGCxboOFN0rLVJPZwZGksEIkw58IHcPhZNT1bHHocWOA/uHJTAynfKsAdv/LDdGKcZWUCFOzlokw54xbPvdrBtEOnYNp15OY01IAJd2FCUki5WHvhELUggTjfank1Tc3/Rt1KrGOFhg80CWq6eMiuiWkHGvYq3fjNLbgjl3JJatUFoB+cX1ulDOGsLJEXQ4v5DNHgel0o2H395owNlStksSeW1UBVk0hUK/ADtVUYKAPEIFiboh1iDpEOl40JVnYdsGz3w5FLj2w+16/1vWs=
+740156eedf2c450aee58b1a90b0e826f47c5da64 0 iQIVAwUAVxLGMCBXgaxoKi1yAQLhIg/8DDX+sCz7LmqO47/FfTo+OqGR+bTTqpfK3WebitL0Z6hbXPj7s45jijqIFGqKgMPqS5oom1xeuGTPHdYA0NNoc/mxSCuNLfuXYolpNWPN71HeSDRV9SnhMThG5HSxI+P0Ye4rbsCHrVV+ib1rV81QE2kZ9aZsJd0HnGd512xJ+2ML7AXweM/4lcLmMthN+oi/dv1OGLzfckrcr/fEATCLZt55eO7idx11J1Fk4ptQ6dQ/bKznlD4hneyy1HMPsGxw+bCXrMF2C/nUiRLHdKgGqZ+cDq6loQRfFlQoIhfoEnWC424qbjH4rvHgkZHqC59Oi/ti9Hi75oq9Tb79yzlCY/fGsdrlJpEzrTQdHFMHUoO9CC+JYObXHRo3ALnC5350ZBKxlkdpmucrHTgcDabfhRlx9vDxP4RDopm2hAjk2LJH7bdxnGEyZYkTOZ3hXKnVpt2hUQb4jyzzC9Kl47TFpPKNVKI+NLqRRZAIdXXiy24KD7WzzE6L0NNK0/IeqKBENLL8I1PmDQ6XmYTQVhTuad1jjm2PZDyGiXmJFZO1O/NGecVTvVynKsDT6XhEvzyEtjXqD98rrhbeMHTcmNSwwJMDvm9ws0075sLQyq2EYFG6ECWFypdA/jfumTmxOTkMtuy/V1Gyq7YJ8YaksZ7fXNY9VuJFP72grmlXc6Dvpr4=
+f85de28eae32e7d3064b1a1321309071bbaaa069 0 iQIVAwUAVyZQaiBXgaxoKi1yAQJhCQ//WrRZ55k3VI/OgY+I/HvgFHOC0sbhe207Kedxvy00a3AtXM6wa5E95GNX04QxUfTWUf5ZHDfEgj0/mQywNrH1oJG47iPZSs+qXNLqtgAaXtrih6r4/ruUwFCRFxqK9mkhjG61SKicw3Q7uGva950g6ZUE5BsZ7XJWgoDcJzWKR+AH992G6H//Fhi4zFQAmB34++sm80wV6wMxVKA/qhQzetooTR2x9qrHpvCKMzKllleJe48yzPLJjQoaaVgXCDav0eIePFNw0WvVSldOEp/ADDdTGa65qsC1rO2BB1Cu5+frJ/vUoo0PwIgqgD6p2i41hfIKvkp6130TxmRVxUx+ma8gBYEpPIabV0flLU72gq8lMlGBBSnQ+fcZsfs/Ug0xRN0tzkEScmZFiDxRGk0y7IalXzv6irwOyC2fZCajXGJDzkROQXWMgy9eKkwuFhZBmPVYtrATSq3jHLVmJg5vfdeiVzA6NKxAgGm2z8AsRrijKK8WRqFYiH6xcWKG5u+FroPQdKa0nGCkPSTH3tvC6fAHTVm7JeXch5QE/LiS9Y575pM2PeIP+k+Fr1ugK0AEvYJAXa5UIIcdszPyI+TwPTtWaQ83X99qGAdmRWLvSYjqevOVr7F/fhO3XKFXRCcHA3EzVYnG7nWiVACYF3H2UgN4PWjStbx/Qhhdi9xAuks=
+a56296f55a5e1038ea5016dace2076b693c28a56 0 iQIVAwUAVyZarCBXgaxoKi1yAQL87g/8D7whM3e08HVGDHHEkVUgqLIfueVy1mx0AkRvelmZmwaocFNGpZTd3AjSwy6qXbRNZFXrWU85JJvQCi3PSo/8bK43kwqLJ4lv+Hv2zVTvz30vbLWTSndH3oVRu38lIA7b5K9J4y50pMCwjKLG9iyp+aQG4RBz76fJMlhXy0gu38A8JZVKEeAnQCbtzxKXBzsC8k0/ku/bEQEoo9D4AAGlVTbl5AsHMp3Z6NWu7kEHAX/52/VKU2I0LxYqRxoL1tjTVGkAQfkOHz1gOhLXUgGSYmA9Fb265AYj9cnGWCfyNonlE0Rrk2kAsrjBTGiLyb8WvK/TZmRo4ZpNukzenS9UuAOKxA22Kf9+oN9kKBu1HnwqusYDH9pto1WInCZKV1al7DMBXbGFcnyTXk2xuiTGhVRG5LzCO2QMByBLXiYl77WqqJnzxK3v5lAc/immJl5qa3ATUlTnVBjAs+6cbsbCoY6sjXCT0ClndA9+iZZ1TjPnmLrSeFh5AoE8WHmnFV6oqGN4caX6wiIW5vO+x5Q2ruSsDrwXosXIYzm+0KYKRq9O+MaTwR44Dvq3/RyeIu/cif/Nc7B8bR5Kf7OiRf2T5u97MYAomwGcQfXqgUfm6y7D3Yg+IdAdAJKitxhRPsqqdxIuteXMvOvwukXNDiWP1zsKoYLI37EcwzvbGLUlZvg=
--- a/.hgtags	Fri Apr 15 13:10:34 2016 -0700
+++ b/.hgtags	Tue May 03 10:41:17 2016 -0500
@@ -136,3 +136,6 @@
 b698abf971e7377d9b7ec7fc8c52df45255b0329 3.7.1
 d493d64757eb45ada99fcb3693e479a51b7782da 3.7.2
 ae279d4a19e9683214cbd1fe8298cf0b50571432 3.7.3
+740156eedf2c450aee58b1a90b0e826f47c5da64 3.8-rc
+f85de28eae32e7d3064b1a1321309071bbaaa069 3.8
+a56296f55a5e1038ea5016dace2076b693c28a56 3.8.1
--- a/Makefile	Fri Apr 15 13:10:34 2016 -0700
+++ b/Makefile	Tue May 03 10:41:17 2016 -0500
@@ -4,8 +4,7 @@
 #
 # % make PREFIX=/opt/ install
 
-PREFIX=/usr/local
-export PREFIX
+export PREFIX=/usr/local
 PYTHON=python
 $(eval HGROOT := $(shell pwd))
 HGPYTHONS ?= $(HGROOT)/build/pythons
@@ -19,6 +18,10 @@
 # Set this to e.g. "mingw32" to use a non-default compiler.
 COMPILER=
 
+COMPILERFLAG_tmp_ =
+COMPILERFLAG_tmp_${COMPILER} ?= -c $(COMPILER)
+COMPILERFLAG=${COMPILERFLAG_tmp_${COMPILER}}
+
 help:
 	@echo 'Commonly used make targets:'
 	@echo '  all          - build program and documentation'
@@ -43,16 +46,16 @@
 local:
 	$(PYTHON) setup.py $(PURE) \
 	  build_py -c -d . \
-	  build_ext $(COMPILER:%=-c %) -i \
-	  build_hgexe $(COMPILER:%=-c %) -i \
+	  build_ext $(COMPILERFLAG) -i \
+	  build_hgexe $(COMPILERFLAG) -i \
 	  build_mo
 	env HGRCPATH= $(PYTHON) hg version
 
 build:
-	$(PYTHON) setup.py $(PURE) build $(COMPILER:%=-c %)
+	$(PYTHON) setup.py $(PURE) build $(COMPILERFLAG)
 
 wheel:
-	FORCE_SETUPTOOLS=1 $(PYTHON) setup.py $(PURE) bdist_wheel $(COMPILER:%=-c %)
+	FORCE_SETUPTOOLS=1 $(PYTHON) setup.py $(PURE) bdist_wheel $(COMPILERFLAG)
 
 doc:
 	$(MAKE) -C doc
@@ -153,26 +156,52 @@
 # Packaging targets
 
 osx:
-	python -c 'import bdist_mpkg.script_bdist_mpkg' || \
-	   (echo "Missing bdist_mpkg (easy_install bdist_mpkg)"; false)
-	rm -rf dist/mercurial-*.mpkg
-	python -m bdist_mpkg.script_bdist_mpkg setup.py --
-	python contrib/fixpax.py dist/mercurial-*.mpkg/Contents/Packages/*.pkg/Contents/Archive.pax.gz
-	mkdir -p packages/osx
-	N=`cd dist && echo mercurial-*.mpkg | sed 's,\.mpkg$$,,'` && hdiutil create -srcfolder dist/$$N.mpkg/ -scrub -volname "$$N" -ov packages/osx/$$N.dmg
-	rm -rf dist/mercurial-*.mpkg
+	python setup.py install --optimize=1 \
+	  --root=build/mercurial/ --prefix=/usr/local/ \
+	  --install-lib=/Library/Python/2.7/site-packages/
+	make -C doc all install DESTDIR="$(PWD)/build/mercurial/"
+	mkdir -p $${OUTPUTDIR:-dist}
+	pkgbuild --root build/mercurial/ --identifier org.mercurial-scm.mercurial \
+	  build/mercurial.pkg
+	HGVER=$$((cat build/mercurial/Library/Python/2.7/site-packages/mercurial/__version__.py; echo 'print(version)') | python) && \
+	OSXVER=$$(sw_vers -productVersion | cut -d. -f1,2) && \
+	productbuild --distribution contrib/macosx/distribution.xml \
+	  --package-path build/ \
+	  --version "$${HGVER}" \
+	  --resources contrib/macosx/ \
+	  "$${OUTPUTDIR:-dist/}"/Mercurial-"$${HGVER}"-macosx"$${OSXVER}".pkg
 
 deb:
 	contrib/builddeb
 
+ppa:
+	contrib/builddeb --source-only
+
 docker-debian-jessie:
 	mkdir -p packages/debian-jessie
 	contrib/dockerdeb debian jessie
 
-docker-ubuntu-trusty:
-	mkdir -p packages/ubuntu-trusty
+contrib/docker/ubuntu-%: contrib/docker/ubuntu.template
+	sed "s/__CODENAME__/$*/" $< > $@
+
+docker-ubuntu-trusty: contrib/docker/ubuntu-trusty
 	contrib/dockerdeb ubuntu trusty
 
+docker-ubuntu-trusty-ppa: contrib/docker/ubuntu-trusty
+	contrib/dockerdeb ubuntu trusty --source-only
+
+docker-ubuntu-wily: contrib/docker/ubuntu-wily
+	contrib/dockerdeb ubuntu wily
+
+docker-ubuntu-wily-ppa: contrib/docker/ubuntu-wily
+	contrib/dockerdeb ubuntu wily --source-only
+
+docker-ubuntu-xenial: contrib/docker/ubuntu-xenial
+	contrib/dockerdeb ubuntu xenial
+
+docker-ubuntu-xenial-ppa: contrib/docker/ubuntu-xenial
+	contrib/dockerdeb ubuntu xenial --source-only
+
 fedora20:
 	mkdir -p packages/fedora20
 	contrib/buildrpm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/bdiff-torture.py	Tue May 03 10:41:17 2016 -0500
@@ -0,0 +1,98 @@
+# Randomized torture test generation for bdiff
+
+from __future__ import absolute_import, print_function
+import random, sys
+from mercurial import (
+    bdiff,
+    mpatch,
+)
+
+def reducetest(a, b):
+    tries = 0
+    reductions = 0
+    print("reducing...")
+    while tries < 1000:
+        a2 = "\n".join(l for l in a.splitlines()
+                       if random.randint(0, 100) > 0) + "\n"
+        b2 = "\n".join(l for l in b.splitlines()
+                       if random.randint(0, 100) > 0) + "\n"
+        if a2 == a and b2 == b:
+            continue
+        if a2 == b2:
+            continue
+        tries += 1
+
+        try:
+            test1(a, b)
+        except Exception as inst:
+            reductions += 1
+            tries = 0
+            a = a2
+            b = b2
+
+    print("reduced:", reductions, len(a) + len(b),
+          repr(a), repr(b))
+    try:
+        test1(a, b)
+    except Exception as inst:
+        print("failed:", inst)
+
+    sys.exit(0)
+
+def test1(a, b):
+    d = bdiff.bdiff(a, b)
+    if not d:
+        raise ValueError("empty")
+    c = mpatch.patches(a, [d])
+    if c != b:
+        raise ValueError("bad")
+
+def testwrap(a, b):
+    try:
+        test1(a, b)
+        return
+    except Exception as inst:
+        pass
+    print("exception:", inst)
+    reducetest(a, b)
+
+def test(a, b):
+    testwrap(a, b)
+    testwrap(b, a)
+
+def rndtest(size, noise):
+    a = []
+    src = "                aaaaaaaabbbbccd"
+    for x in xrange(size):
+        a.append(src[random.randint(0, len(src) - 1)])
+
+    while True:
+        b = [c for c in a if random.randint(0, 99) > noise]
+        b2 = []
+        for c in b:
+            b2.append(c)
+            while random.randint(0, 99) < noise:
+                b2.append(src[random.randint(0, len(src) - 1)])
+        if b2 != a:
+            break
+
+    a = "\n".join(a) + "\n"
+    b = "\n".join(b2) + "\n"
+
+    test(a, b)
+
+maxvol = 10000
+startsize = 2
+while True:
+    size = startsize
+    count = 0
+    while size < maxvol:
+        print(size)
+        volume = 0
+        while volume < maxvol:
+            rndtest(size, 2)
+            volume += size
+            count += 2
+        size *= 2
+    maxvol *= 4
+    startsize *= 4
--- a/contrib/builddeb	Fri Apr 15 13:10:34 2016 -0700
+++ b/contrib/builddeb	Tue May 03 10:41:17 2016 -0500
@@ -10,6 +10,7 @@
 CLEANUP=1
 DISTID=`(lsb_release -is 2> /dev/null | tr '[:upper:]' '[:lower:]') || echo debian`
 CODENAME=`lsb_release -cs 2> /dev/null || echo unknown`
+DEBFLAGS=-b
 while [ "$1" ]; do
     case "$1" in
     --distid )
@@ -30,6 +31,10 @@
         shift
         CLEANUP=
         ;;
+    --source-only )
+        shift
+        DEBFLAGS=-S
+        ;;
     * )
         echo "Invalid parameter $1!" 1>&2
         exit 1
@@ -52,7 +57,7 @@
     debver="$debver~$type"
 fi
 if [ -n "$distance" ] ; then
-    debver="$debver+$distance-$node"
+    debver="$debver+$distance-$CODENAME-$node"
 fi
 
 control=debian/control
@@ -65,16 +70,17 @@
     fi
 
     cp -r $PWD/contrib/debian debian
-    chmod -R 0755 debian
 
-    # This looks like sed -i, but sed -i behaves just differently enough
-    # between BSD and GNU sed that I gave up and did the dumb thing.
-    sed "s/__VERSION__/$debver/" < $changelog > $changelog.tmp
-    date=$(date --rfc-2822)
-    sed "s/__DATE__/$date/" < $changelog.tmp > $changelog
+    sed -i.tmp "s/__VERSION__/$debver/" $changelog
+    sed -i.tmp "s/__DATE__/$(date --rfc-2822)/" $changelog
+    sed -i.tmp "s/__CODENAME__/$CODENAME/" $changelog
     rm $changelog.tmp
 
-    debuild -us -uc -b
+    # remove the node from the version string
+    SRCFILE="mercurial_$(echo $debver | sed "s,-$node,,").orig.tar.gz"
+    "$PWD/hg" archive $SRCFILE
+    mv $SRCFILE ..
+    debuild -us -uc -i -I $DEBFLAGS
     if [ $? != 0 ]; then
         echo 'debuild failed!'
         exit 1
@@ -86,7 +92,8 @@
     OUTPUTDIR=${OUTPUTDIR:=packages/$DISTID-$CODENAME}
     mkdir -p "$OUTPUTDIR"
     find ../mercurial*.deb ../mercurial_*.build ../mercurial_*.changes \
-          -type f -newer $control -print0 | \
+          ../mercurial*.dsc ../mercurial*.gz \
+          -type f -newer $control -print0 2>/dev/null | \
       xargs -Inarf -0 mv narf "$OUTPUTDIR"
     echo "Built packages for $debver:"
     find "$OUTPUTDIR" -type f -newer $control -name '*.deb'
--- a/contrib/chg/chg.c	Fri Apr 15 13:10:34 2016 -0700
+++ b/contrib/chg/chg.c	Tue May 03 10:41:17 2016 -0500
@@ -42,7 +42,7 @@
 static void initcmdserveropts(struct cmdserveropts *opts) {
 	memset(opts, 0, sizeof(struct cmdserveropts));
 	opts->lockfd = -1;
-	opts->sockdirfd = AT_FDCWD;
+	opts->sockdirfd = -1;
 }
 
 static void freecmdserveropts(struct cmdserveropts *opts) {
@@ -50,9 +50,9 @@
 	opts->args = NULL;
 	opts->argsize = 0;
 	assert(opts->lockfd == -1 && "should be closed by unlockcmdserver()");
-	if (opts->sockdirfd != AT_FDCWD) {
+	if (opts->sockdirfd >= 0) {
 		close(opts->sockdirfd);
-		opts->sockdirfd = AT_FDCWD;
+		opts->sockdirfd = -1;
 	}
 }
 
@@ -397,6 +397,10 @@
 	if (sigaction(SIGTERM, &sa, NULL) < 0)
 		goto error;
 
+	/* notify the worker about window resize events */
+	sa.sa_flags = SA_RESTART;
+	if (sigaction(SIGWINCH, &sa, NULL) < 0)
+		goto error;
 	/* propagate job control requests to worker */
 	sa.sa_handler = forwardsignal;
 	sa.sa_flags = SA_RESTART;
--- a/contrib/debian/changelog	Fri Apr 15 13:10:34 2016 -0700
+++ b/contrib/debian/changelog	Tue May 03 10:41:17 2016 -0500
@@ -1,4 +1,4 @@
-mercurial (__VERSION__) unstable; urgency=medium
+mercurial (__VERSION__) __CODENAME__; urgency=medium
 
   * Automated build performed by upstream.
 
--- a/contrib/debian/control	Fri Apr 15 13:10:34 2016 -0700
+++ b/contrib/debian/control	Tue May 03 10:41:17 2016 -0500
@@ -3,9 +3,14 @@
 Priority: optional
 Maintainer: Mercurial Developers <mercurial-devel@selenic.com>
 Build-Depends:
- debhelper (>= 7),
+ debhelper (>= 9),
  dh-python,
- python-all
+ netbase,
+ python-all,
+ python-all-dev,
+ python-docutils,
+ unzip,
+ zip
 Standards-Version: 3.9.4
 X-Python-Version: >= 2.6
 
--- a/contrib/docker/ubuntu-trusty	Fri Apr 15 13:10:34 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-FROM ubuntu:trusty
-RUN apt-get update && apt-get install -y \
-  build-essential \
-  debhelper \
-  dh-python \
-  devscripts \
-  python \
-  python-all-dev \
-  python-docutils \
-  zip \
-  unzip
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/docker/ubuntu.template	Tue May 03 10:41:17 2016 -0500
@@ -0,0 +1,11 @@
+FROM ubuntu:__CODENAME__
+RUN apt-get update && apt-get install -y \
+  build-essential \
+  debhelper \
+  dh-python \
+  devscripts \
+  python \
+  python-all-dev \
+  python-docutils \
+  zip \
+  unzip
--- a/contrib/dockerdeb	Fri Apr 15 13:10:34 2016 -0700
+++ b/contrib/dockerdeb	Tue May 03 10:41:17 2016 -0500
@@ -4,14 +4,14 @@
 . $(dirname $0)/packagelib.sh
 
 BUILDDIR=$(dirname $0)
-export ROOTDIR=$(cd $BUILDDIR/..; pwd)
+export ROOTDIR=$(cd $BUILDDIR/.. > /dev/null; pwd)
 
 checkdocker
 
 DISTID="$1"
 CODENAME="$2"
 PLATFORM="$1-$2"
-shift # extra params are passed to build process
+shift; shift # extra params are passed to build process
 
 OUTPUTDIR=${OUTPUTDIR:=$ROOTDIR/packages/$PLATFORM}
 
@@ -27,7 +27,7 @@
             sh -c "cd /mnt/$dn && make clean && make local"
 fi
 $DOCKER run -u $DBUILDUSER --rm -v $PWD/..:/mnt $CONTAINER \
-  sh -c "cd /mnt/$dn && DEB_BUILD_OPTIONS='${DEB_BUILD_OPTIONS:=}' contrib/builddeb --build --distid $DISTID --codename $CODENAME"
+  sh -c "cd /mnt/$dn && DEB_BUILD_OPTIONS='${DEB_BUILD_OPTIONS:=}' contrib/builddeb --build --distid $DISTID --codename $CODENAME $@"
 contrib/builddeb --cleanup --distid $DISTID --codename $CODENAME
 if [ $(uname) = "Darwin" ] ; then
     $DOCKER run -u $DBUILDUSER --rm -v $PWD/..:/mnt $CONTAINER \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/macosx/distribution.xml	Tue May 03 10:41:17 2016 -0500
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<installer-gui-script minSpecVersion="1">
+  <title>Mercurial SCM</title>
+  <organization>org.mercurial-scm</organization>
+  <options customize="never" require-scripts="false" rootVolumeOnly="true" />
+  <welcome file="Welcome.html" mime-type="text/html" />
+  <license file="../../COPYING" mime-type="text/plain" />
+  <readme file="Readme.html" mime-type="text/html" />
+  <pkg-ref id="org.mercurial-scm.mercurial"
+           version="0"
+           auth="root"
+           onConclusion="none">mercurial.pkg</pkg-ref>
+  <choices-outline>
+    <line choice="org.mercurial-scm.mercurial"/>
+  </choices-outline>
+  <choice id="org.mercurial-scm.mercurial" visible="false">
+    <pkg-ref id="org.mercurial-scm.mercurial"/>
+  </choice>
+</installer-gui-script>
--- a/hgext/convert/git.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/hgext/convert/git.py	Tue May 03 10:41:17 2016 -0500
@@ -57,6 +57,10 @@
         super(convert_git, self).__init__(ui, path, revs=revs)
         common.commandline.__init__(self, ui, 'git')
 
+        # Pass an absolute path to git to prevent from ever being interpreted
+        # as a URL
+        path = os.path.abspath(path)
+
         if os.path.isdir(path + "/.git"):
             path += "/.git"
         if not os.path.exists(path + "/objects"):
--- a/hgext/patchbomb.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/hgext/patchbomb.py	Tue May 03 10:41:17 2016 -0500
@@ -572,7 +572,7 @@
                     msg %= (publicurl, missing[0])
                 revhint = ' '.join('-r %s' % h
                                   for h in repo.set('heads(%ld)', missing))
-                hint = _('use "hg push %s %s"') % (publicurl, revhint)
+                hint = _("use 'hg push %s %s'") % (publicurl, revhint)
                 raise error.Abort(msg, hint=hint)
 
     # start
--- a/hgext/rebase.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/hgext/rebase.py	Tue May 03 10:41:17 2016 -0500
@@ -69,12 +69,12 @@
             c(ctx, extra)
     return extrafn
 
-def _destrebase(repo, sourceset):
+def _destrebase(repo, sourceset, destspace=None):
     """small wrapper around destmerge to pass the right extra args
 
     Please wrap destutil.destmerge instead."""
     return destutil.destmerge(repo, action='rebase', sourceset=sourceset,
-                              onheadcheck=False)
+                              onheadcheck=False, destspace=destspace)
 
 revsetpredicate = registrar.revsetpredicate()
 
@@ -222,6 +222,9 @@
         srcf = opts.get('source', None)
         basef = opts.get('base', None)
         revf = opts.get('rev', [])
+        # search default destination in this space
+        # used in the 'hg pull --rebase' case, see issue 5214.
+        destspace = opts.get('_destspace')
         contf = opts.get('continue')
         abortf = opts.get('abort')
         collapsef = opts.get('collapse', False)
@@ -296,7 +299,8 @@
                 _checkobsrebase(repo, ui, rebaseobsrevs, rebasesetrevs,
                                 rebaseobsskipped)
         else:
-            dest, rebaseset = _definesets(ui, repo, destf, srcf, basef, revf)
+            dest, rebaseset = _definesets(ui, repo, destf, srcf, basef, revf,
+                                          destspace=destspace)
             if dest is None:
                 return _nothingtorebase()
 
@@ -525,9 +529,12 @@
     finally:
         release(lock, wlock)
 
-def _definesets(ui, repo, destf=None, srcf=None, basef=None, revf=[]):
+def _definesets(ui, repo, destf=None, srcf=None, basef=None, revf=[],
+                destspace=None):
     """use revisions argument to define destination and rebase set
     """
+    # destspace is here to work around issues with `hg pull --rebase` see
+    # issue5214 for details
     if srcf and basef:
         raise error.Abort(_('cannot specify both a source and a base'))
     if revf and basef:
@@ -560,7 +567,7 @@
                         "can't compute rebase set\n"))
             return None, None
         if not destf:
-            dest = repo[_destrebase(repo, base)]
+            dest = repo[_destrebase(repo, base, destspace=destspace)]
             destf = str(dest)
 
         commonanc = repo.revs('ancestor(%ld, %d)', base, dest).first()
@@ -598,7 +605,7 @@
             return None, None
 
     if not destf:
-        dest = repo[_destrebase(repo, rebaseset)]
+        dest = repo[_destrebase(repo, rebaseset, destspace=destspace)]
         destf = str(dest)
 
     return dest, rebaseset
@@ -1237,6 +1244,9 @@
                 # --source.
                 if 'source' in opts:
                     del opts['source']
+                # revsprepull is the len of the repo, not revnum of tip.
+                destspace = list(repo.changelog.revs(start=revsprepull))
+                opts['_destspace'] = destspace
                 try:
                     rebase(ui, repo, **opts)
                 except error.NoMergeDestAbort:
--- a/i18n/pt_BR.po	Fri Apr 15 13:10:34 2016 -0700
+++ b/i18n/pt_BR.po	Tue May 03 10:41:17 2016 -0500
@@ -31,8 +31,8 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2016-01-31 09:42-0200\n"
-"PO-Revision-Date: 2016-02-01 12:09-0200\n"
+"POT-Creation-Date: 2016-04-30 20:49-0300\n"
+"PO-Revision-Date: 2016-04-30 18:41-0300\n"
 "Last-Translator: Wagner Bruna <wbruna@softwareexpress.com.br>\n"
 "Language-Team: Brazilian Portuguese <>\n"
 "MIME-Version: 1.0\n"
@@ -503,25 +503,71 @@
 msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
 msgstr "acl: o acesso do usuário \"%s\" a \"%s\" não foi permitido (revisão \"%s\")"
 
+msgid "Check for unrecorded moves at commit time (EXPERIMENTAL)"
+msgstr ""
+"Testa por renomeações não registradas no momento da consolidação "
+"(EXPERIMENTAL)"
+
+msgid ""
+"This extension checks at commit/amend time if any of the committed files\n"
+"comes from an unrecorded mv."
+msgstr ""
+"Esta extensão verifica durante consolidações se algum arquivo consolidado\n"
+"foi renomeado sem registrar essa renomeação pelo comando mv."
+
+msgid ""
+"The threshold at which a file is considered a move can be set with the\n"
+"``automv.similarity`` config option. This option takes a percentage between 0\n"
+"(disabled) and 100 (files must be identical), the default is 95."
+msgstr ""
+"O limiar no qual um arquivo será considerado uma renomeação\n"
+"pode ser definido com a opção de configuração ``automv.similarity``.\n"
+"Esta opção recebe uma porcentagem entre 0 (desabilitado) e 100\n"
+"(os arquivos devem ser idênticos). O valor padrão é 95."
+
+msgid "disable automatic file move detection"
+msgstr "desabilita detecção automática de renomeações"
+
+msgid "automv.similarity must be between 0 and 100"
+msgstr "automv.similarity deve ser um número entre 0 e 100"
+
+#, python-format
+msgid "detected move of %s as %s (%d%% similar)\n"
+msgstr "detectada remoção de %s como %s (%d%% de similaridade)\n"
+
+#, python-format
+msgid "detected move of %d files\n"
+msgstr "foram detectadas renomeações de %d arquivos\n"
+
 msgid "log repository events to a blackbox for debugging"
 msgstr "registra eventos do repositório para depuração"
 
 msgid ""
 "Logs event information to .hg/blackbox.log to help debug and diagnose problems.\n"
-"The events that get logged can be configured via the blackbox.track config key.\n"
-"Examples::"
+"The events that get logged can be configured via the blackbox.track config key."
 msgstr ""
 "Registra informação de eventos no arquivo .hg/blackbox.log para auxiliar\n"
 "depuração e diagnóstico de problemas. Os eventos que serão registrados\n"
-"podem ser configurados através da opção de configuração blackbox.track.\n"
-"Exemplos::"
+"podem ser configurados através da opção de configuração blackbox.track."
+
+msgid "Examples::"
+msgstr "Exemplos::"
 
 msgid ""
 "  [blackbox]\n"
-"  track = *"
+"  track = *\n"
+"  # dirty is *EXPENSIVE* (slow);\n"
+"  # each log entry indicates `+` if the repository is dirty, like :hg:`id`.\n"
+"  dirty = True\n"
+"  # record the source of log messages\n"
+"  logsource = True"
 msgstr ""
 "  [blackbox]\n"
-"  track = *"
+"  track = *\n"
+"  # dirty é *CARO* (lento); cada entrada do log indica `+`   # se o repositório estiver sujo, como em :hg:`id`.\n"
+"  dirty = True\n"
+"  # grava a origem das mensagens de log\n"
+"  logsource = True"
 
 msgid ""
 "  [blackbox]\n"
@@ -1383,11 +1429,35 @@
 "    substitui os.environ completamente"
 
 msgid ""
-"'SIGHUP' signal\n"
-"    reload configuration files\n"
-msgstr ""
-"sinal 'SIGHUP'\n"
-"    relê arquivos de configuração\n"
+"'setumask' command\n"
+"    set umask"
+msgstr ""
+"comando 'setumask'\n"
+"    define a umask"
+
+msgid ""
+"'validate' command\n"
+"    reload the config and check if the server is up to date"
+msgstr ""
+"comando 'validate' command\n"
+"    relê a configuração e checa se o servidor está atualizado"
+
+msgid ""
+"Config\n"
+"------"
+msgstr ""
+"Configuração\n"
+"------------"
+
+msgid ""
+"  [chgserver]\n"
+"  idletimeout = 3600 # seconds, after which an idle server will exit\n"
+"  skiphash = False   # whether to skip config or env change checks\n"
+msgstr ""
+"  [chgserver]\n"
+"  idletimeout = 3600 # segundos após os quais um servidor\n"
+"                     # sem atividade fechará\n"
+"  skiphash = False   # omite checagens de mudanças ou ambiente\n"
 
 msgid "invalid response"
 msgstr "resposta inválida"
@@ -1432,11 +1502,11 @@
 msgstr "    Por favor use :hg:`log`::"
 
 msgid ""
-"        hg children => hg log -r 'children()'\n"
-"        hg children -r REV => hg log -r 'children(REV)'"
-msgstr ""
-"        hg children => hg log -r 'children()'\n"
-"        hg children -r REV => hg log -r 'children(REV)'"
+"        hg children => hg log -r \"children()\"\n"
+"        hg children -r REV => hg log -r \"children(REV)\""
+msgstr ""
+"        hg children => hg log -r \"children()\"\n"
+"        hg children -r REV => hg log -r \"children(REV)\""
 
 msgid "    See :hg:`help log` and :hg:`help revsets.children`."
 msgstr "    Veja :hg:`help log` e :hg:`help revsets.children`."
@@ -1454,6 +1524,9 @@
 msgid "analyzing"
 msgstr "analisando"
 
+msgid "revisions"
+msgstr "revisões"
+
 msgid "count rate for the specified revision or revset"
 msgstr "conta a frequência para uma revisão ou revset especificado"
 
@@ -2132,10 +2205,6 @@
 msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
 msgstr "ignorando cor/efeito desconhecido %r (configurado em color.%s)\n"
 
-#. i18n: "label" is a keyword
-msgid "label expects two arguments"
-msgstr "label espera dois argumentos"
-
 #. i18n: 'always', 'auto', 'never', and 'debug' are keywords
 #. and should not be translated
 msgid "when to colorize (boolean, always, auto, never, or debug)"
@@ -3047,6 +3116,9 @@
 msgid "getting files"
 msgstr "obtendo arquivos"
 
+msgid "files"
+msgstr "arquivos"
+
 #, python-format
 msgid "syntax error in %s(%d): child parent1[,parent2] expected"
 msgstr "erro de sintaxe em %s(%d): \"filho pai1[,pai2]\" esperado"
@@ -3055,9 +3127,6 @@
 msgid "splicemap file not found or error reading %s:"
 msgstr "arquivo splicemap não encontrado, ou erro ao ler %s:"
 
-msgid "revisions"
-msgstr "revisões"
-
 msgid "scanning"
 msgstr "varrendo"
 
@@ -3333,6 +3402,10 @@
 msgstr "não é possível ler mudanças em %s"
 
 #, python-format
+msgid "cannot retrieve number of commits in %s"
+msgstr "não é possível obter o número de revisões em %s"
+
+#, python-format
 msgid "cannot read tags from %s"
 msgstr "não é possível ler etiquetas de %s"
 
@@ -3582,6 +3655,9 @@
 msgid "scanning paths"
 msgstr "varrendo caminhos"
 
+msgid "paths"
+msgstr "caminhos"
+
 #, python-format
 msgid "found parent of branch %s at %d: %s\n"
 msgstr "encontrado pai do ramo %s em %d: %s\n"
@@ -4193,8 +4269,8 @@
 msgid "working directory not at branch tip"
 msgstr "diretório de trabalho não está na tip do ramo"
 
-msgid "use \"hg update\" to check out branch tip"
-msgstr "use \"hg update\" para obter a tip do ramo"
+msgid "use 'hg update' to check out branch tip"
+msgstr "use 'hg update' para obter a tip do ramo"
 
 msgid "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
 msgstr "múltiplas cabeças nesse ramo (use \"hg heads .\" e \"hg merge\" para mesclar"
@@ -4230,6 +4306,120 @@
 msgid "new changeset %d:%s merges remote changes with local\n"
 msgstr "nova revisão %d:%s mescla alterações remotas com local\n"
 
+msgid "Faster status operations with the Watchman file monitor (EXPERIMENTAL)"
+msgstr ""
+
+msgid ""
+"Integrates the file-watching program Watchman with Mercurial to produce faster\n"
+"status results."
+msgstr ""
+
+msgid ""
+"On a particular Linux system, for a real-world repository with over 400,000\n"
+"files hosted on ext4, vanilla `hg status` takes 1.3 seconds. On the same\n"
+"system, with fsmonitor it takes about 0.3 seconds."
+msgstr ""
+
+msgid ""
+"fsmonitor requires no configuration -- it will tell Watchman about your\n"
+"repository as necessary. You'll need to install Watchman from\n"
+"https://facebook.github.io/watchman/ and make sure it is in your PATH."
+msgstr ""
+
+msgid "The following configuration options exist:"
+msgstr "Existem as seguintes opções de configuração::"
+
+msgid ""
+"    [fsmonitor]\n"
+"    mode = {off, on, paranoid}"
+msgstr ""
+
+msgid ""
+"When `mode = off`, fsmonitor will disable itself (similar to not loading the\n"
+"extension at all). When `mode = on`, fsmonitor will be enabled (the default).\n"
+"When `mode = paranoid`, fsmonitor will query both Watchman and the filesystem,\n"
+"and ensure that the results are consistent."
+msgstr ""
+
+msgid ""
+"    [fsmonitor]\n"
+"    timeout = (float)"
+msgstr ""
+
+msgid ""
+"A value, in seconds, that determines how long fsmonitor will wait for Watchman\n"
+"to return results. Defaults to `2.0`."
+msgstr ""
+
+msgid ""
+"    [fsmonitor]\n"
+"    blacklistusers = (list of userids)"
+msgstr ""
+
+msgid ""
+"A list of usernames for which fsmonitor will disable itself altogether."
+msgstr ""
+
+msgid ""
+"    [fsmonitor]\n"
+"    walk_on_invalidate = (boolean)"
+msgstr ""
+
+msgid ""
+"Whether or not to walk the whole repo ourselves when our cached state has been\n"
+"invalidated, for example when Watchman has been restarted or .hgignore rules\n"
+"have been changed. Walking the repo in that case can result in competing for\n"
+"I/O with Watchman. For large repos it is recommended to set this value to\n"
+"false. You may wish to set this to true if you have a very fast filesystem\n"
+"that can outpace the IPC overhead of getting the result data for the full repo\n"
+"from Watchman. Defaults to false."
+msgstr ""
+
+msgid ""
+"fsmonitor is incompatible with the largefiles and eol extensions, and\n"
+"will disable itself if any of those are active."
+msgstr ""
+
+msgid "unknown"
+msgstr "desconhecido"
+
+msgid "character device"
+msgstr "dispositivo de caracteres"
+
+msgid "block device"
+msgstr "dispositivo de bloco"
+
+msgid "fifo"
+msgstr "fifo"
+
+msgid "socket"
+msgstr "socket"
+
+msgid "directory"
+msgstr "diretório"
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr "tipo de arquivo não suportado (o tipo é %s)"
+
+#, python-format
+msgid "warning: unable to write to %s\n"
+msgstr "aviso: incapaz de escrever em %s\n"
+
+#, python-format
+msgid ""
+"The fsmonitor extension is incompatible with the %s extension and has been "
+"disabled.\n"
+msgstr ""
+"A extensão fsmonitor é incompatível com a extensão %s e foi desabilitada.\n"
+
+#, python-format
+msgid "type '%s' has no property '%s'"
+msgstr "o tipo '%s' não tem a propriedade '%s'"
+
+msgid "warning: unable to write out fsmonitor state\n"
+msgstr "aviso: incapaz de escrever o estado da fsmonitor\n"
+
 msgid "commands to sign and verify changesets"
 msgstr "comando para assinar e verificar revisões"
 
@@ -4961,13 +5151,6 @@
 "origem, você pode adicionar uma opção ``--force``."
 
 msgid ""
-"Config\n"
-"------"
-msgstr ""
-"Configuração\n"
-"------------"
-
-msgid ""
 "Histedit rule lines are truncated to 80 characters by default. You\n"
 "can customize this behavior by setting a different length in your\n"
 "configuration file::"
@@ -5026,11 +5209,15 @@
 msgstr "Revisões são listadas da mais antiga para a mais recente"
 
 #, python-format
+msgid "You can reorder changesets by reordering the lines"
+msgstr "Você pode reordenar revisões reordenando as linhas"
+
+#, python-format
 msgid "Commands:\n"
 msgstr "Comandos:\n"
 
-msgid "no histedit in progress"
-msgstr "nenhuma edição de histórico em andamento"
+msgid "histedit"
+msgstr "histedit"
 
 #, python-format
 msgid "unknown changeset %s listed"
@@ -5044,8 +5231,8 @@
 msgstr "hg histedit --continue para retomar"
 
 #, python-format
-msgid "%s: empty changeset\n"
-msgstr "%s: revisão vazia\n"
+msgid "%s: skipping changeset (no changes)\n"
+msgstr "%s: omitindo revisão (nenhuma mudança)\n"
 
 #, python-format
 msgid "cannot fold into public change %s"
@@ -5077,6 +5264,10 @@
 msgstr "usa a revisão, mas combina com a acima"
 
 #, python-format
+msgid "%s: empty changeset\n"
+msgstr "%s: revisão vazia\n"
+
+#, python-format
 msgid ""
 "%s: cannot fold - working copy is not a descendant of previous commit %s\n"
 msgstr ""
@@ -5183,10 +5374,10 @@
 
 msgid ""
 "    - Use --outgoing -- it will be the first linear changeset not\n"
-"      included in destination. (See :hg:`help config.default-push`)"
+"      included in destination. (See :hg:`help config.paths.default-push`)"
 msgstr ""
 "    - Usar --outgoing -- será a primeira revisão linear não\n"
-"      incluída no destino. (veja :hg:`help config.default-push`)"
+"      incluída no destino. (veja :hg:`help config.paths.default-push`)"
 
 msgid ""
 "    - Otherwise, the value from the \"histedit.defaultrev\" config option\n"
@@ -5357,6 +5548,12 @@
 msgid "histedit requires exactly one ancestor revision"
 msgstr "histedit requer exatamente uma revisão ancestral"
 
+msgid "editing"
+msgstr "editando"
+
+msgid "changes"
+msgstr "mudanças"
+
 msgid ""
 "warning: encountered an exception during histedit --abort; the repository "
 "may not have been completely cleaned up\n"
@@ -5371,14 +5568,10 @@
 msgid "%s is not an ancestor of working directory"
 msgstr "%s não é um ancestral do diretório de trabalho"
 
-msgid "editing"
-msgstr "editando"
-
-msgid "changes"
-msgstr "mudanças"
-
-msgid "cannot edit history that would orphan nodes"
-msgstr "não é possível editar histórico de forma a produzir nós órfãos"
+msgid "can only histedit a changeset together with all its descendants"
+msgstr ""
+"não é possível usar histedit para editar uma revisão junto com todos os seus"
+" descendentes"
 
 msgid "cannot edit history that contains merges"
 msgstr "não é possível editar histórico que contenha mesclagens"
@@ -5420,6 +5613,12 @@
 msgid "duplicated command for changeset %s"
 msgstr "comando duplicado para a revisão %s"
 
+msgid "no rules provided"
+msgstr "nenhuma regra fornecida"
+
+msgid "use strip extension to remove commits"
+msgstr "use a extensão strip para remover revisões"
+
 #, python-format
 msgid "missing rules for changeset %s"
 msgstr "regras faltando para a revisão %s"
@@ -5851,11 +6050,11 @@
 msgid ""
 "  $ dd if=/dev/urandom of=randomdata count=2000\n"
 "  $ hg add --large randomdata\n"
-"  $ hg commit -m 'add randomdata as a largefile'"
+"  $ hg commit -m \"add randomdata as a largefile\""
 msgstr ""
 "  $ dd if=/dev/urandom of=randomdata count=2000\n"
 "  $ hg add --large randomdata\n"
-"  $ hg commit -m 'add randomdata as a largefile'"
+"  $ hg commit -m \"adiciona randomdata como um largefile\""
 
 msgid ""
 "When you push a changeset that adds/modifies largefiles to a remote\n"
@@ -6226,6 +6425,10 @@
 msgstr "sistema operacional desconhecido: %s\n"
 
 #, python-format
+msgid "unknown %s usercache location\n"
+msgstr "localização de cache de usuário %s desconhecida\n"
+
+#, python-format
 msgid "found %s in store\n"
 msgstr "encontrado %s no armazenamento\n"
 
@@ -6463,9 +6666,53 @@
 msgid "download largefiles for these revisions"
 msgstr "baixa largefiles para estas revisões"
 
+msgid "upload largefiles for these revisions"
+msgstr "envia largefiles para estas revisões"
+
 msgid "download all versions of all largefiles"
 msgstr "baixa todas as versões de todos os largefiles"
 
+msgid "Send ui.log() data to a subprocess (EXPERIMENTAL)"
+msgstr ""
+
+msgid ""
+"This extension lets you specify a shell command per ui.log() event,\n"
+"sending all remaining arguments to as environment variables to that command."
+msgstr ""
+
+msgid ""
+"Each positional argument to the method results in a `MSG[N]` key in the\n"
+"environment, starting at 1 (so `MSG1`, `MSG2`, etc.). Each keyword argument\n"
+"is set as a `OPT_UPPERCASE_KEY` variable (so the key is uppercased, and\n"
+"prefixed with `OPT_`). The original event name is passed in the `EVENT`\n"
+"environment variable, and the process ID of mercurial is given in `HGPID`."
+msgstr ""
+
+msgid ""
+"So given a call `ui.log('foo', 'bar', 'baz', spam='eggs'), a script configured\n"
+"for the `foo` event can expect an environment with `MSG1=bar`, `MSG2=baz`, and\n"
+"`OPT_SPAM=eggs`."
+msgstr ""
+
+msgid ""
+"Scripts are configured in the `[logtoprocess]` section, each key an event name.\n"
+"For example::"
+msgstr ""
+
+msgid ""
+"  [logtoprocess]\n"
+"  commandexception = echo \"$MSG2$MSG3\" > /var/log/mercurial_exceptions.log"
+msgstr ""
+
+msgid ""
+"would log the warning message and traceback of any failed command dispatch."
+msgstr ""
+
+msgid ""
+"Scripts are run asychronously as detached daemon processes; mercurial will\n"
+"not ensure that they exit cleanly."
+msgstr ""
+
 msgid "manage a stack of patches"
 msgstr "gerencia uma pilha de patches"
 
@@ -8027,8 +8274,12 @@
 msgid "mq:     (empty queue)\n"
 msgstr "mq:           (fila vazia)\n"
 
-msgid "Changesets managed by MQ."
-msgstr "Revisões gerenciadas pela MQ."
+msgid ""
+"``mq()``\n"
+"    Changesets managed by MQ."
+msgstr ""
+"``mq()``\n"
+"    Revisões gerenciadas pela MQ."
 
 msgid "mq takes no arguments"
 msgstr "mq não tem argumentos"
@@ -8923,8 +9174,8 @@
 msgstr "url pública %s não possui %s"
 
 #, python-format
-msgid "use \"hg push %s %s\""
-msgstr "use \"hg push %s %s\""
+msgid "use 'hg push %s %s'"
+msgstr "use 'hg push %s %s'"
 
 msgid "no recipient addresses provided"
 msgstr "nenhum endereço de destinatário fornecido"
@@ -8951,6 +9202,9 @@
 msgid "sending"
 msgstr "enviando"
 
+msgid "emails"
+msgstr "emails"
+
 msgid "writing"
 msgstr "escrevendo"
 
@@ -9078,10 +9332,6 @@
 "Para mais informações:\n"
 "https://mercurial-scm.org/wiki/RebaseExtension\n"
 
-#. i18n: "_rebasedefaultdest" is a keyword
-msgid "_rebasedefaultdest takes no arguments"
-msgstr "_rebasedefaultdest não tem argumentos"
-
 msgid "rebase the specified changeset and descendants"
 msgstr "rebaseia a revisão especificada e seus descendentes"
 
@@ -9148,14 +9398,21 @@
 "    Para copiar revisões, veja :hg:`help graft`."
 
 msgid ""
-"    If you don't specify a destination changeset (``-d/--dest``),\n"
-"    rebase uses the current branch tip as the destination. (The\n"
-"    destination changeset is not modified by rebasing, but new\n"
-"    changesets are added as its descendants.)"
+"    If you don't specify a destination changeset (``-d/--dest``), rebase\n"
+"    will use the same logic as :hg:`merge` to pick a destination.  if\n"
+"    the current branch contains exactly one other head, the other head\n"
+"    is merged with by default.  Otherwise, an explicit revision with\n"
+"    which to merge with must be provided.  (destination changeset is not\n"
+"    modified by rebasing, but new changesets are added as its\n"
+"    descendants.)"
 msgstr ""
 "    Se você não especificar uma revisão de destino (opção ``-d/--dest``),\n"
-"    rebase usará como destino a cabeça mais recente do ramo nomeado\n"
-"    atual (a revisão de destino não é modificada pelo rebaseamento, mas\n"
+"    rebase usará a mesma lógica que :hg:`merge` para escolher um destino.\n"
+"    Se o ramo atual contiver exatamente uma outra cabeça, essa outra\n"
+"    cabeça será mesclada por padrão.\n"
+"    Caso contrário, uma revisão explícita com a qual mesclar deverá ser\n"
+"    fornecida.\n"
+"    (a revisão de destino não é modificada pelo rebaseamento, mas\n"
 "    novas revisões são acrescentadas como seus descendentes)."
 
 msgid "    Here are the ways to select changesets:"
@@ -9213,6 +9470,18 @@
 "    e/ou o destino."
 
 msgid ""
+"    If you need to use a tool to automate merge/conflict decisions, you\n"
+"    can specify one with ``--tool``, see :hg:`help merge-tools`.\n"
+"    As a caveat: the tool will not be used to mediate when a file was\n"
+"    deleted, there is no hook presently available for this."
+msgstr ""
+"    Caso você precise usar uma ferramenta para automatizar decisões\n"
+"    em conflitos de mesclagens, ela pode ser especificada com\n"
+"    ``--tool``; veja :hg:`help merge-tools`.\n"
+"    Note que tal ferramenta não será usada para mediar remoções de\n"
+"    arquivo; no momento não há uma forma de especificar isso."
+
+msgid ""
 "    If a rebase is interrupted to manually resolve a conflict, it can be\n"
 "    continued with --continue/-c or aborted with --abort/-a."
 msgstr ""
@@ -9312,50 +9581,6 @@
 msgid "use \"hg rebase --abort\" to clear broken state"
 msgstr "use \"hg rebase --abort\" para limpar o estado quebrado"
 
-msgid "cannot specify both a source and a base"
-msgstr "não se pode especificar ao mesmo tempo uma origem e uma base"
-
-msgid "cannot specify both a revision and a base"
-msgstr "não se pode especificar ao mesmo tempo uma revisão e uma base"
-
-msgid "cannot specify both a revision and a source"
-msgstr "não se pode especificar ao mesmo tempo uma revisão e uma origem"
-
-msgid "empty \"rev\" revision set - nothing to rebase\n"
-msgstr "conjunto de revisões \"rev\" vazio - nada para rebasear\n"
-
-msgid "empty \"source\" revision set - nothing to rebase\n"
-msgstr "conjunto de revisões \"fonte\" vazio - nada para rebasear\n"
-
-msgid "empty \"base\" revision set - can't compute rebase set\n"
-msgstr ""
-"conjunto de revisões \"base\" vazio - não é possível calcular o conjunto de "
-"rebaseamento\n"
-
-#, python-format
-msgid "nothing to rebase - %s is both \"base\" and destination\n"
-msgstr "nada para rebasear - %s é tanto \"base\" como destino\n"
-
-msgid "nothing to rebase - working directory parent is also destination\n"
-msgstr ""
-"nada para rebasear - o pai do diretório de trabalho também é o destino.\n"
-
-#, python-format
-msgid "nothing to rebase - \"base\" %s is already an ancestor of destination %s\n"
-msgstr "nada para rebasear - a \"base\" %s já é um ancestral do destino %s\n"
-
-#, python-format
-msgid ""
-"nothing to rebase - working directory parent is already an ancestor of "
-"destination %s\n"
-msgstr ""
-"nada para rebasear - o pai do diretório de trabalho já é um ancestral do "
-"destino %s\n"
-
-#, python-format
-msgid "nothing to rebase from %s to %s\n"
-msgstr "nada para rebasear de %s para %s\n"
-
 msgid "can't remove original changesets with unrebased descendants"
 msgstr ""
 "não é possível remover revisões originais que tenham descendentes não "
@@ -9364,23 +9589,6 @@
 msgid "use --keep to keep original changesets"
 msgstr "use --keep para manter as revisões originais"
 
-msgid "this rebase will cause divergence"
-msgstr "este rebaseamento causará divergências"
-
-msgid "to force the rebase please set rebase.allowdivergence=True"
-msgstr "para forçar o rebaseamento configure rebase.allowdivergence=True"
-
-msgid "all requested changesets have equivalents or were marked as obsolete"
-msgstr ""
-"todas as revisões pedidas possuem equivalentes ou foram marcadas como "
-"obsoletas"
-
-msgid ""
-"to force the rebase, set the config experimental.rebaseskipobsolete to False"
-msgstr ""
-"para forçar o rebaseamento, configure experimental.rebaseskipobsolete como "
-"False"
-
 msgid "nothing to rebase\n"
 msgstr "nada para rebasear\n"
 
@@ -9443,12 +9651,76 @@
 msgid "%d revisions have been skipped\n"
 msgstr "%d revisões foram omitidas\n"
 
+msgid "cannot specify both a source and a base"
+msgstr "não se pode especificar ao mesmo tempo uma origem e uma base"
+
+msgid "cannot specify both a revision and a base"
+msgstr "não se pode especificar ao mesmo tempo uma revisão e uma base"
+
+msgid "cannot specify both a revision and a source"
+msgstr "não se pode especificar ao mesmo tempo uma revisão e uma origem"
+
+msgid "empty \"rev\" revision set - nothing to rebase\n"
+msgstr "conjunto de revisões \"rev\" vazio - nada para rebasear\n"
+
+msgid "empty \"source\" revision set - nothing to rebase\n"
+msgstr "conjunto de revisões \"fonte\" vazio - nada para rebasear\n"
+
+msgid "empty \"base\" revision set - can't compute rebase set\n"
+msgstr ""
+"conjunto de revisões \"base\" vazio - não é possível calcular o conjunto de "
+"rebaseamento\n"
+
+#, python-format
+msgid "nothing to rebase - %s is both \"base\" and destination\n"
+msgstr "nada para rebasear - %s é tanto \"base\" como destino\n"
+
+msgid "nothing to rebase - working directory parent is also destination\n"
+msgstr ""
+"nada para rebasear - o pai do diretório de trabalho também é o destino.\n"
+
+#, python-format
+msgid "nothing to rebase - \"base\" %s is already an ancestor of destination %s\n"
+msgstr "nada para rebasear - a \"base\" %s já é um ancestral do destino %s\n"
+
+#, python-format
+msgid ""
+"nothing to rebase - working directory parent is already an ancestor of "
+"destination %s\n"
+msgstr ""
+"nada para rebasear - o pai do diretório de trabalho já é um ancestral do "
+"destino %s\n"
+
+#, python-format
+msgid "nothing to rebase from %s to %s\n"
+msgstr "nada para rebasear de %s para %s\n"
+
 #, python-format
 msgid ""
 "unable to collapse on top of %s, there is more than one external parent: %s"
 msgstr "incapaz de colapsar sobre %s, há mais de um pai externo: %s"
 
 #, python-format
+msgid "this rebase will cause divergences from: %s"
+msgstr "este rebaseamento causará divergências a partir de: %s"
+
+msgid "to force the rebase please set experimental.allowdivergence=True"
+msgstr ""
+"para forçar o rebaseamento por favor configure "
+"experimental.allowdivergence=True"
+
+msgid "all requested changesets have equivalents or were marked as obsolete"
+msgstr ""
+"todas as revisões pedidas possuem equivalentes ou foram marcadas como "
+"obsoletas"
+
+msgid ""
+"to force the rebase, set the config experimental.rebaseskipobsolete to False"
+msgstr ""
+"para forçar o rebaseamento, configure experimental.rebaseskipobsolete como "
+"False"
+
+#, python-format
 msgid "cannot use revision %d as base, result would have 3 parents"
 msgstr "não se pode usar a revisão %d como base, o resultado teria 3 pais"
 
@@ -9459,6 +9731,9 @@
 msgid "no rebase in progress"
 msgstr "nenhum rebaseamento em andamento"
 
+msgid "rebase"
+msgstr "%d rebaseados"
+
 msgid ".hg/rebasestate is incomplete"
 msgstr ".hg/rebasestate está incompleto"
 
@@ -9487,9 +9762,8 @@
 msgstr ""
 "aviso: novas revisões detectadas no ramo de origem, strip não realizado\n"
 
-#, python-format
-msgid "updating bookmark %s\n"
-msgstr "atualizando marcador %s\n"
+msgid "nothing to rebase - updating instead\n"
+msgstr "nada para rebasear de %s para %s\n"
 
 msgid "--tool can only be used with --rebase"
 msgstr "--tool só pode ser usada em conjunto com --rebase"
@@ -9522,9 +9796,18 @@
 msgid "hg rebase --continue"
 msgstr "hg rebase --continue"
 
-msgid "commands to interactively select changes for commit/qrefresh"
-msgstr ""
-"comandos para selecionar interativamente mudanças em um commit ou qrefresh"
+msgid ""
+"commands to interactively select changes for commit/qrefresh (DEPRECATED)"
+msgstr ""
+"comandos para selecionar interativamente mudanças em um commit ou qrefresh "
+"(OBSOLETO)"
+
+msgid ""
+"The feature provided by this extension has been moved into core Mercurial as\n"
+":hg:`commit --interactive`."
+msgstr ""
+"A funcionalidade desta extensão foi incluída no Mercurial\n"
+"como :hg:`commit --interactive`."
 
 msgid "hg record [OPTION]... [FILE]..."
 msgstr "hg record [OPÇÃO]... [ARQUIVO]..."
@@ -9689,9 +9972,6 @@
 msgid "collecting"
 msgstr "coletando"
 
-msgid "files"
-msgstr "arquivos"
-
 #, python-format
 msgid "collected %d candidate storage files\n"
 msgstr "coletados %d arquivos candidatos nos repositórios\n"
@@ -9793,6 +10073,13 @@
 msgid "custom scheme %s:// conflicts with drive letter %s:\\\n"
 msgstr "esquema personalizado %s:// conflita com a letra de unidade %s:\\\n"
 
+msgid ""
+"given a repo path, provide the scheme-expanded path\n"
+"    "
+msgstr ""
+"dado um camino para um repositório, fornece o caminho com o esquema expandido\n"
+"    "
+
 msgid "share a common history between several working directories"
 msgstr "compartilha histórico comum entre vários diretórios de trabalho"
 
@@ -10014,6 +10301,10 @@
 msgid "unshelve of '%s' aborted\n"
 msgstr "unshelve de '%s' abortado\n"
 
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "diretório de trabalho marcado como ramo %s\n"
+
 msgid "unresolved conflicts, can't continue"
 msgstr "conflitos não resolvidos, não é possível continuar"
 
@@ -10086,6 +10377,16 @@
 "    "
 
 msgid ""
+"    If bare shelved change(when no files are specified, without interactive,\n"
+"    include and exclude option) was done on newly created branch it would\n"
+"    restore branch information to the working directory."
+msgstr ""
+"    Se uma operação shelve simples (se não forem especificados\n"
+"    arquivos, e sem as opções interactive, include e exclude),\n"
+"    foi feita em um ramo recém criado, restaura a informação de\n"
+"    ramo no diretório de trabalho."
+
+msgid ""
 "    After a successful unshelve, the shelved changes are stored in a\n"
 "    backup directory. Only the N most recent backups are kept. N\n"
 "    defaults to 10 but can be overridden using the ``shelve.maxbackups``\n"
@@ -10113,8 +10414,8 @@
 msgstr ""
 "não é possível combinar abort/continue com um nome de mudança engavetada"
 
-msgid "no unshelve operation underway"
-msgstr "nenhuma operação unshelve em andamento"
+msgid "unshelve"
+msgstr "unshelve"
 
 msgid "can only unshelve one change at a time"
 msgstr "só é possível realizar unshelve de uma mudança de cada vez"
@@ -10212,6 +10513,20 @@
 "    engavetadas."
 
 msgid ""
+"    In bare shelve(when no files are specified, without interactive,\n"
+"    include and exclude option), shelving remembers information if the\n"
+"    working directory was on newly created branch, in other words working\n"
+"    directory was on different branch than its first parent. In this\n"
+"    situation unshelving restores branch information to the working directory."
+msgstr ""
+"    Em uma operação shelve simples (se não forem especificados\n"
+"    arquivos, e sem as opções interactive, include e exclude),\n"
+"    a shelve registra o ramo o diretório de trabalho, se for\n"
+"    diferente do ramo do primeiro pai. Nessa situação, a\n"
+"    operação unshelve restaura tal informação de ramo no\n"
+"    diretório de trabalho."
+
+msgid ""
 "    Each shelved change has a name that makes it easier to find later.\n"
 "    The name of a shelved change defaults to being based on the active\n"
 "    bookmark, or if there is no active bookmark, the current named\n"
@@ -10303,8 +10618,8 @@
 msgid "remove revs only reachable from given bookmark"
 msgstr "remove revisões alcançáveis apenas pelo marcador dado"
 
-msgid "hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..."
-msgstr "hg strip [-k] [-f] [-n] [-B marcador] [-r] REV..."
+msgid "hg strip [-k] [-f] [-B bookmark] [-r] REV..."
+msgstr "hg strip [-k] [-f] [-B marcador] [-r] REV..."
 
 msgid "strip changesets and all their descendants from the repository"
 msgstr "remove do repositório revisões e todos os seus descendentes"
@@ -10624,9 +10939,12 @@
 msgid "outstanding local changes"
 msgstr "alterações locais pendentes"
 
-msgid "Transplanted changesets in set, or all transplanted changesets."
-msgstr ""
-"Revisões transplantadas no conjunto, ou todas as revisões transplantadas."
+msgid ""
+"``transplanted([set])``\n"
+"    Transplanted changesets in set, or all transplanted changesets."
+msgstr ""
+"``transplanted([conjunto])``\n"
+"    Revisões transplantadas no conjunto, ou todas as revisões transplantadas."
 
 msgid ""
 ":transplanted: String. The node identifier of the transplanted\n"
@@ -10932,6 +11250,10 @@
 msgstr "o marcador remoto %s aponta para uma revisão %s faltando no local\n"
 
 #, python-format
+msgid "updating bookmark %s\n"
+msgstr "atualizando marcador %s\n"
+
+#, python-format
 msgid "importing bookmark %s\n"
 msgstr "importando marcador %s\n"
 
@@ -10983,6 +11305,13 @@
 msgid "Seek failed\n"
 msgstr "Seek falhou\n"
 
+msgid "old bundle types only supports v1 changegroups"
+msgstr "tipos de bundle antigos suportam apenas changegroups v1"
+
+#, python-format
+msgid "unknown stream compression type: %s"
+msgstr "tipo de compressão de stream desconhecido: %s"
+
 msgid ""
 "bundle contains tree manifests, but local repo is non-empty and does not use"
 " tree manifests"
@@ -11031,6 +11360,10 @@
 msgid "Unsupported changegroup version: %s"
 msgstr "Versão de changegroup não suportada: %s"
 
+#, python-format
+msgid "setting parent to node %s that only exists in the bundle\n"
+msgstr "definindo o pai para o nó %s que só existe no bundle\n"
+
 msgid "cannot create new bundle repository"
 msgstr "não é possível criar novo repositório de bundle"
 
@@ -11043,13 +11376,6 @@
 msgid "invalid chunk length %d"
 msgstr "comprimento de trecho inválido %d"
 
-msgid "old bundle types only supports v1 changegroups"
-msgstr "tipos de bundle antigos suportam apenas changegroups v1"
-
-#, python-format
-msgid "unknown stream compression type: %s"
-msgstr "tipo de compressão de stream desconhecido: %s"
-
 msgid "manifests"
 msgstr "manifestos"
 
@@ -11082,10 +11408,6 @@
 msgid "bundling"
 msgstr "criando bundle"
 
-#, python-format
-msgid "%8.i (manifests)\n"
-msgstr "%8.i (manifestos)\n"
-
 msgid "uncompressed size of bundle content:\n"
 msgstr "tamanho não comprimido do conteúdo do bundle:\n"
 
@@ -11094,6 +11416,10 @@
 msgstr "%8.i (changelog)\n"
 
 #, python-format
+msgid "%8.i (manifests)\n"
+msgstr "%8.i (manifestos)\n"
+
+#, python-format
 msgid "empty or missing revlog for %s"
 msgstr "revlog vazio ou não encontrado para %s"
 
@@ -11251,6 +11577,10 @@
 msgid "child process failed to start"
 msgstr "processo filho falhou ao iniciar"
 
+#, python-format
+msgid "invalid value for --daemon-postexec: %s"
+msgstr "valor inválido para --daemon-postexec: %s"
+
 msgid "not a Mercurial patch"
 msgstr "não é um patch do Mercurial"
 
@@ -11350,10 +11680,6 @@
 msgstr "sumário:      %s\n"
 
 #, python-format
-msgid "%s: no key named '%s'"
-msgstr "%s: nenhuma chave nomeada '%s'"
-
-#, python-format
 msgid "found revision %s from %s\n"
 msgstr "encontrada revisão %s de %s\n"
 
@@ -11385,6 +11711,15 @@
 msgid "skipping missing subrepository: %s\n"
 msgstr "desconsiderando sub-repositório faltando: %s\n"
 
+msgid "searching"
+msgstr "procurando"
+
+msgid "subrepos"
+msgstr "subrepos"
+
+msgid "deleting"
+msgstr "apagando"
+
 #, python-format
 msgid "not removing %s: no tracked files\n"
 msgstr "%s não removido: nenhum arquivo rastreado\n"
@@ -11393,6 +11728,9 @@
 msgid "not removing %s: file is untracked\n"
 msgstr "arquivo %s não removido: arquivo não rastreado\n"
 
+msgid "skipping"
+msgstr "omitindo"
+
 msgid "failed to mark all new/missing files as added/removed"
 msgstr ""
 "falha ao marcar todos os arquivos novos/ausentes como adicionados/removidos"
@@ -11492,6 +11830,10 @@
 msgid "file not managed: %s\n"
 msgstr "arquivo não gerenciado: %s\n"
 
+#, python-format
+msgid "forget added file %s (yn)?$$ &Yes $$ &No"
+msgstr "a mesclagem de '%s' teve sucesso (yn)?$$ (&Y) sim $$ &Não"
+
 msgid "graft in progress"
 msgstr "enxerto em andamento"
 
@@ -11508,13 +11850,17 @@
 msgstr "hg graft --continue"
 
 #, python-format
-msgid "continue: %s\n"
-msgstr "continue: %s\n"
+msgid "continue: %s"
+msgstr "continue: %s"
 
 msgid "hg commit"
 msgstr "hg commit"
 
 #, python-format
+msgid "no %s in progress"
+msgstr "nenhuma operação '%s' em andamento"
+
+#, python-format
 msgid "can't close already inactivated backup: dirstate%s"
 msgstr "não é possível fechar um backup já desativado: dirstate%s"
 
@@ -12684,10 +13030,6 @@
 msgid "use 'hg update' to switch to it"
 msgstr "use 'hg update' para mudar para ele"
 
-#, python-format
-msgid "marked working directory as branch %s\n"
-msgstr "diretório de trabalho marcado como ramo %s\n"
-
 msgid "(branches are permanent and global, did you want a bookmark?)\n"
 msgstr ""
 "(ramos nomeados são permanentes e globais, use um bookmark para um marcador "
@@ -12699,8 +13041,8 @@
 msgid "show normal and closed branches"
 msgstr "mostra ramos normais e fechados"
 
-msgid "[-ac]"
-msgstr "[-ac]"
+msgid "[-c]"
+msgstr "[-c]"
 
 msgid "list repository named branches"
 msgstr "lista os ramos nomeados do repositório"
@@ -12825,8 +13167,8 @@
 msgid "packed bundles cannot be produced by \"hg bundle\""
 msgstr "packed bundles não podem ser produzidos por \"hg bundle\""
 
-msgid "use \"hg debugcreatestreamclonebundle\""
-msgstr "use \"hg debugcreatestreamclonebundle\""
+msgid "use 'hg debugcreatestreamclonebundle'"
+msgstr "use 'hg debugcreatestreamclonebundle'"
 
 msgid "--all is incompatible with specifying a destination"
 msgstr "--all é incompatível com uma especificação de destino"
@@ -12834,6 +13176,10 @@
 msgid "ignoring --base because --all was specified\n"
 msgstr "ignorando --base porque --all foi especificada\n"
 
+#, python-format
+msgid "repository does not support bundle version %s"
+msgstr "o repositório não suporta a versão de bundle %s"
+
 msgid "--base is incompatible with specifying a destination"
 msgstr "--base é incompatível com uma especificação de destino"
 
@@ -13764,8 +14110,13 @@
 msgid "checking encoding (%s)...\n"
 msgstr "verificando codificação (%s)...\n"
 
-msgid " (check that your locale is properly set)\n"
-msgstr " (verifique se seu locale está configurado propriamente)\n"
+#, python-format
+msgid ""
+" %s\n"
+" (check that your locale is properly set)\n"
+msgstr ""
+" %s\n"
+" (verifique se seu locale está configurado propriamente)\n"
 
 #, python-format
 msgid "checking Python executable (%s)\n"
@@ -13783,46 +14134,53 @@
 msgid "checking installed modules (%s)...\n"
 msgstr "verificando módulos instalados (%s)...\n"
 
-msgid " One or more extensions could not be found"
-msgstr " Uma ou mais extensões não puderam ser encontradas"
-
-msgid " (check that you compiled the extensions)\n"
-msgstr " (verifique se você compilou as extensões)\n"
-
-#, python-format
-msgid "checking templates (%s)...\n"
-msgstr "verificando modelos (%s)...\n"
-
-msgid " template 'default' not found\n"
-msgstr " modelo 'default' não encontrado\n"
-
 msgid " no template directories found\n"
 msgstr " nenhum diretório de modelos foi encontrado\n"
 
+#, python-format
+msgid "checking default template (%s)\n"
+msgstr "verificando modelo padrão (%s)...\n"
+
+#, python-format
+msgid " template '%s' not found\n"
+msgstr " modelo '%s' não encontrado\n"
+
 msgid " (templates seem to have been installed incorrectly)\n"
 msgstr " (modelos parecem ter sido instalados incorretamente)\n"
 
-msgid "checking commit editor...\n"
-msgstr "verificando editor para consolidação...\n"
-
-msgid " No commit editor set and can't find vi in PATH\n"
-msgstr ""
-" Nenhum editor para consolidação configurado, e não foi possível encontrar "
-"'vi' no PATH\n"
-
-msgid " (specify a commit editor in your configuration file)\n"
-msgstr ""
+#, python-format
+msgid "checking commit editor... (%s)\n"
+msgstr "verificando editor para consolidação... (%s)\n"
+
+#, python-format
+msgid ""
+" No commit editor set and can't find %s in PATH\n"
+" (specify a commit editor in your configuration file)\n"
+msgstr ""
+" Nenhum editor para consolidação definido e %s não foi encontrado no PATH\n"
 " (especifique um editor para consolidação em seu arquivo de configuração)\n"
 
 #, python-format
-msgid " Can't find editor '%s' in PATH\n"
-msgstr " Não é possível localizar editor '%s' no PATH\n"
-
-msgid "checking username...\n"
-msgstr "verificando nome de usuário...\n"
-
-msgid " (specify a username in your configuration file)\n"
-msgstr " (especifique um nome de usuário em seu arquivo de configuração)\n"
+msgid ""
+" Can't find editor '%s' in PATH\n"
+" (specify a commit editor in your configuration file)\n"
+msgstr ""
+" O editor '%s' não foi encontrado no PATH\n"
+" (especifique um editor para consolidação em seu arquivo de configuração)\n"
+
+#, python-format
+msgid "checking username (%s)\n"
+msgstr "verificando nome de usuário (%s)\n"
+
+#, python-format
+msgid ""
+"checking username...\n"
+" %s\n"
+" (specify a username in your configuration file)\n"
+msgstr ""
+"verificando nome de usuário...\n"
+" %s\n"
+" (especifique um nome de usuário em seu arquivo de configuração)\n"
 
 msgid "no problems detected\n"
 msgstr "nenhum problema detectado\n"
@@ -13929,6 +14287,12 @@
 msgid "display markers relevant to REV"
 msgstr "mostra marcações relevantes para REV"
 
+msgid "display index of the marker"
+msgstr "exibe índice da marcação"
+
+msgid "delete markers specified by indices"
+msgstr "apaga marcações especificadas por índices"
+
 msgid "[OBSOLETED [REPLACEMENT ...]]"
 msgstr "[[OBSOLETA [SUBSTITUTA ...]]"
 
@@ -13939,6 +14303,21 @@
 msgstr "    Sem parâmetros, mostra a lista de marcações de obsolescência."
 
 #, python-format
+msgid "invalid index value: %r"
+msgstr "valor de índice inválido: %r"
+
+msgid "use integers for indices"
+msgstr "use inteiros para os índices"
+
+msgid "cannot delete obsmarkers in the middle of transaction."
+msgstr ""
+"não é possível apagar marcações de obsolescência durante uma transação."
+
+#, python-format
+msgid "deleted %i obsolescense markers\n"
+msgstr "%i marcações de obsolescência apagadas\n"
+
+#, python-format
 msgid "bad obsmarker input: %s"
 msgstr "entrada obsmarker ruim: %s"
 
@@ -14210,6 +14589,41 @@
 "    três (a revisão foi dividida).\n"
 "    "
 
+msgid "apply template on changesets"
+msgstr "aplica o modelo nas revisões"
+
+msgid "KEY=VALUE"
+msgstr "CHAVE=VALOR"
+
+msgid "define template keyword"
+msgstr "define uma palavra chave do modelo"
+
+msgid "[-r REV]... [-D KEY=VALUE]... TEMPLATE"
+msgstr "[-r REV]... [-D CHAVE=VALOR]... MODELO"
+
+msgid "parse and apply a template"
+msgstr "decodifica e aplica um modelo"
+
+msgid ""
+"    If -r/--rev is given, the template is processed as a log template and\n"
+"    applied to the given changesets. Otherwise, it is processed as a generic\n"
+"    template."
+msgstr ""
+"    Se -r/--rev for fornecida, o modelo será processado como um modelo\n"
+"    de log e aplicado às revisões pedidas.\n"
+"    Caso contrário, será processado como um modelo genérico."
+
+msgid ""
+"    Use --verbose to print the parsed tree.\n"
+"    "
+msgstr ""
+"    Use --verbose para imprimir a árvore decodificada.\n"
+"    "
+
+#, python-format
+msgid "malformed keyword definition: %s"
+msgstr "definição de palavra chave malformada: %s"
+
 msgid "show how files match on given patterns"
 msgstr "mostra como os arquivos casam com os padrões pedidos"
 
@@ -14680,8 +15094,8 @@
 msgid "      - show revisions sorted by date::"
 msgstr "      - mostra revisões ordenadas por data::"
 
-msgid "          hg log -r 'sort(all(), date)'"
-msgstr "          hg log -r 'sort(all(), date)'"
+msgid "          hg log -r \"sort(all(), date)\""
+msgstr "          hg log -r \"sort(all(), date)\""
 
 msgid ""
 "    See :hg:`help revisions` and :hg:`help revsets` for more about\n"
@@ -14707,8 +15121,8 @@
 msgid "can't specify --continue and revisions"
 msgstr "não é possível especificar --continue e revisões"
 
-msgid "no graft state found, can't continue"
-msgstr "estado de graft não encontrado, não é possível continuar"
+msgid "graft"
+msgstr "força o enxerto"
 
 #, python-format
 msgid "skipping ungraftable merge revision %s\n"
@@ -14743,8 +15157,8 @@
 msgstr "enxertando %s\n"
 
 #, python-format
-msgid "use hg resolve and hg graft --continue%s"
-msgstr "use hg resolve e hg graft --continue%s"
+msgid "use 'hg resolve' and 'hg graft --continue%s'"
+msgstr "use 'hg resolve' e 'hg graft --continue%s'"
 
 #, python-format
 msgid "note: graft of %d:%s created no changes to commit\n"
@@ -15043,8 +15457,8 @@
 msgid "commit even if some hunks fail"
 msgstr "consolida mesmo que alguns trechos falhem"
 
-msgid "apply patch to the nodes from which it was generated"
-msgstr "aplica o patch aos nós a partir dos quais ele foi gerado"
+msgid "abort if patch would apply lossily"
+msgstr "aborta se o patch seria aplicado com perdas"
 
 msgid "apply patch to subdirectory"
 msgstr "aplica o patch em um subdiretório"
@@ -15124,14 +15538,18 @@
 "    If --exact is specified, import will set the working directory to\n"
 "    the parent of each patch before applying it, and will abort if the\n"
 "    resulting changeset has a different ID than the one recorded in\n"
-"    the patch. This may happen due to character set problems or other\n"
-"    deficiencies in the text patch format."
+"    the patch. This will guard against various ways that portable\n"
+"    patch formats and mail systems might fail to transfer Mercurial\n"
+"    data or metadata. See ':hg: bundle' for lossless transmission."
 msgstr ""
 "    Se --exact for especificado, import irá posicionar o diretório de\n"
 "    trabalho no pai de cada patch antes de aplicá-lo, e irá abortar\n"
 "    se a revisão resultante tiver um ID diferente do gravado no\n"
-"    patch. Isso pode acontecer por problemas de conjunto de\n"
-"    caracteres ou outras deficiências no formato de texto de patch."
+"    patch.\n"
+"    Isso protegerá contra várias falhas nos formatos portáveis\n"
+"    de patch e sistemas de email ao transferir dados ou metadados\n"
+"    do Mercurial.\n"
+"    Veja ':hg: bundle' para uma forma de transmissão sem perdas."
 
 msgid ""
 "    Use --partial to ensure a changeset will be created from the patch\n"
@@ -15666,8 +16084,8 @@
 msgid "review revisions to merge (no merge is performed)"
 msgstr "avalia revisões a serem mescladas (a mesclagem não é executada)"
 
-msgid "[-P] [-f] [[-r] REV]"
-msgstr "[-P] [-f] [[-r] REV]"
+msgid "[-P] [[-r] REV]"
+msgstr "[-P] [[-r] REV]"
 
 msgid "merge another revision into working directory"
 msgstr "mescla uma outra revisão com o diretório de trabalho"
@@ -16118,11 +16536,14 @@
 msgid ""
 "    If -B/--bookmark is used, the specified bookmarked revision, its\n"
 "    ancestors, and the bookmark will be pushed to the remote\n"
-"    repository."
+"    repository. Specifying ``.`` is equivalent to specifying the active\n"
+"    bookmark's name."
 msgstr ""
 "    Se -B/--bookmark for usado, a revisão marcada especificada, seus\n"
 "    ancestrais, e o próprio marcador serão enviados para o repositório\n"
-"    remoto."
+"    remoto.\n"
+"    Especificar ``.`` é equivalente a especificar o nome do marcador\n"
+"    ativo."
 
 msgid ""
 "    Please see :hg:`help urls` for important details about ``ssh://``\n"
@@ -16182,8 +16603,8 @@
 msgid "record delete for missing files"
 msgstr "grava remoção de arquivos faltando"
 
-msgid "remove (and delete) file even if added or modified"
-msgstr "remove (e apaga) o arquivo mesmo se foi adicionado ou modificado"
+msgid "forget added files, delete modified files"
+msgstr "esquece arquivos adicionados, remove arquivos modificados"
 
 msgid "remove the specified files on the next commit"
 msgstr "remove os arquivos pedidos na próxima consolidação"
@@ -16408,6 +16829,10 @@
 msgid "not unmarking %s as it is driver-resolved\n"
 msgstr "não desmarcando %s pois é resolvida por um driver\n"
 
+#, python-format
+msgid "(try: hg resolve %s%s)\n"
+msgstr "(tente: hg resolve %s%s)\n"
+
 msgid "arguments do not match paths that need resolving\n"
 msgstr "os argumentos não correspondem a caminhos que necessitem de resolução\n"
 
@@ -16497,8 +16922,8 @@
 msgid "uncommitted merge with no revision specified"
 msgstr "mesclagem não consolidada, e não foi especificada uma revisão"
 
-msgid "use \"hg update\" or see \"hg help revert\""
-msgstr "use \"hg update\" ou veja \"hg help revert\""
+msgid "use 'hg update' or see 'hg help revert'"
+msgstr "use 'hg update' ou veja 'hg help revert'"
 
 msgid ""
 "uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
@@ -16881,6 +17306,11 @@
 "    Com a opção --remote, isto verificará no caminho default mudanças ainda\n"
 "    não sincronizadas. Isto pode levar algum tempo."
 
+#, python-format
+msgid "warning: merge state has unsupported record types: %s\n"
+msgstr ""
+"aviso: o estado de mesclagem possui tipos de registro não suportados: %s\n"
+
 #. i18n: column positioning for "hg summary"
 #, python-format
 msgid "parent: %d:%s "
@@ -16902,11 +17332,6 @@
 msgstr "marcadores:  "
 
 #, python-format
-msgid "warning: merge state has unsupported record types: %s\n"
-msgstr ""
-"aviso: o estado de mesclagem possui tipos de registro não suportados: %s\n"
-
-#, python-format
 msgid "%d modified"
 msgstr "%d modificados"
 
@@ -17226,8 +17651,8 @@
 msgid "discard uncommitted changes (no backup)"
 msgstr "descarta mudanças não consolidadas (sem backup)"
 
-msgid "update across branches if no uncommitted changes"
-msgstr "atualiza através de ramos, se não houverem mudanças pendentes"
+msgid "require clean working directory"
+msgstr "exige um diretório de trabalho limpo"
 
 msgid "[-c] [-C] [-d DATE] [[-r] REV]"
 msgstr "[-c] [-C] [-d DATA] [[-r] REV]"
@@ -17331,14 +17756,6 @@
 msgid "cannot specify both -c/--check and -C/--clean"
 msgstr "não se pode especificar ao mesmo tempo -c/--check e -C/--clean"
 
-#, python-format
-msgid "(leaving bookmark %s)\n"
-msgstr "(mantendo marcador %s)\n"
-
-#, python-format
-msgid "(activating bookmark %s)\n"
-msgstr "(ativando marcador %s)\n"
-
 msgid "verify the integrity of the repository"
 msgstr "verifica a integridade do repositório"
 
@@ -17391,6 +17808,16 @@
 "\n"
 "Extensões habilitadas:"
 
+msgid "internal"
+msgstr "interno"
+
+msgid "external"
+msgstr "externo"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "a extensão '%s' sobrepõe o comando: %s\n"
+
 #, python-format
 msgid "unknown command %s"
 msgstr "comando %s desconhecido"
@@ -17491,6 +17918,42 @@
 msgid "copy failed: %s is not a file or a symbolic link\n"
 msgstr "cópia falhou: %s não é um arquivo ou um link simbólico\n"
 
+msgid ""
+"# To remove '-' lines, make them ' ' lines (context).\n"
+"# To remove '+' lines, delete them.\n"
+"# Lines starting with # will be removed from the patch.\n"
+msgstr ""
+"# Para remover linhas '-', marque-as como linhas ' ' (contexto).\n"
+"# Para remover linhas '+', apague-as.\n"
+"# Linhas iniciadas por '#' serão removidas do patch.\n"
+
+msgid ""
+"#\n"
+"# If the patch applies cleanly, the edited hunk will immediately be\n"
+"# added to the record list. If it does not apply cleanly, a rejects file\n"
+"# will be generated. You can use that when you try again. If all lines\n"
+"# of the hunk are removed, then the edit is aborted and the hunk is left\n"
+"# unchanged.\n"
+msgstr ""
+"#\n"
+"# Se o patch aplicar de forma limpa, o trecho editado será adicionado\n"
+"# imediatamente à lista de gravação. Se o patch não aplicar de forma\n"
+"# limpa, um arquivo de rejeitos será gerado: você poderá usar esse\n"
+"# arquivo ao tentar novamente. Se todas as linhas do trecho forem\n"
+"# removidas, a edição será abortada e o trecho não será modificado.\n"
+
+msgid ""
+"#\n"
+"# If the patch applies cleanly, the edited patch will immediately\n"
+"# be finalised. If it does not apply cleanly, rejects files will be\n"
+"# generated. You can use those when you try again.\n"
+msgstr ""
+"#\n"
+"# Se o patch aplicar de forma limpa, o patch editado será\n"
+"# finalizado imediatamente. Se o patch não aplicar de forma\n"
+"# limpa, arquivos de rejeitos serão gerados. Você poderá usar\n"
+"# esses arquivos ao tentar novamente.\n"
+
 msgid "confirm"
 msgstr "confirmar"
 
@@ -17503,32 +17966,6 @@
 msgid "cannot edit patch for binary file"
 msgstr "não é possível editar um patch para um arquivo binário"
 
-msgid ""
-"\n"
-"    to remove '-' lines, make them ' ' lines (context).\n"
-"    to remove '+' lines, delete them.\n"
-"    lines starting with # will be removed from the patch."
-msgstr ""
-"\n"
-"    para remover linhas '-', marque-as como linhas ' ' (contexto).\n"
-"    para remover linhas '+', apague-as.\n"
-"    linhas iniciadas por '#' serão removidas do patch."
-
-msgid ""
-"    if the patch applies cleanly, the edited hunk will immediately be\n"
-"    added to the record list. if it does not apply cleanly, a rejects\n"
-"    file will be generated: you can use that when you try again. if\n"
-"    all lines of the hunk are removed, then the edit is aborted and\n"
-"    the hunk is left unchanged.\n"
-"    "
-msgstr ""
-"    Se o patch aplicar de forma limpa, o trecho editado será adicionado\n"
-"    imediatamente à lista de gravação. Se o patch não aplicar de forma\n"
-"    limpa, um arquivo de rejeitos será gerado: você poderá usar esse\n"
-"    arquivo ao tentar novamente. Se todas as linhas do trecho forem\n"
-"    removidas, a edição será abortada e o trecho não será modificado.\n"
-"    "
-
 msgid "user quit"
 msgstr "usuário encerrou"
 
@@ -17563,10 +18000,6 @@
 msgid "merge or update --check to force update"
 msgstr "execute merge, ou update --check para forçar a atualização"
 
-#, python-format
-msgid "branch %s not found"
-msgstr "ramo %s não encontrado"
-
 msgid ""
 "multiple matching bookmarks to merge - please merge with an explicit rev or "
 "bookmark"
@@ -17578,12 +18011,26 @@
 msgstr "execute 'hg heads' para ver todas as cabeças"
 
 msgid ""
+"multiple matching bookmarks to rebase - please rebase to an explicit rev or "
+"bookmark"
+msgstr ""
+"múltiplos marcadores para rebasear - por favor rebaseie para uma revisão ou "
+"marcador explícitos"
+
+msgid ""
 "no matching bookmark to merge - please merge with an explicit rev or "
 "bookmark"
 msgstr ""
 "nenhum marcador correspondente para mesclar - por favor mescle com uma "
 "revisão ou marcador explícitos"
 
+msgid ""
+"no matching bookmark to rebase - please rebase to an explicit rev or "
+"bookmark"
+msgstr ""
+"nenhum marcador correspondente para rebasear - por favor rebaseie para "
+"uma revisão ou marcador explícitos"
+
 #, python-format
 msgid "branch '%s' has %d heads - please merge with an explicit rev"
 msgstr ""
@@ -17592,20 +18039,39 @@
 msgid "run 'hg heads .' to see heads"
 msgstr "execute 'hg heads .' para ver as cabeças"
 
+#, python-format
+msgid "branch '%s' has %d heads - please rebase to an explicit rev"
+msgstr ""
+"o ramo '%s' tem %d cabeças - por favor rebaseie para uma revisão explícita"
+
 msgid "heads are bookmarked - please merge with an explicit rev"
 msgstr ""
 "as cabeças estão marcadas com bookmarks - por favor mescle com uma revisão "
 "explícita"
 
+msgid "heads are bookmarked - please rebase to an explicit rev"
+msgstr ""
+"as cabeças estão marcadas com bookmarks - por favor rebaseie para uma "
+"revisão explícita"
+
 #, python-format
 msgid "branch '%s' has one head - please merge with an explicit rev"
 msgstr ""
 "o ramo '%s' tem apenas uma cabeça - por favor mescle com uma revisão "
 "explícita"
 
+#, python-format
+msgid "branch '%s' has one head - please rebase to an explicit rev"
+msgstr ""
+"o ramo '%s' tem apenas uma cabeça - por favor rebaseie para uma "
+"revisão explícita"
+
 msgid "nothing to merge"
 msgstr "nada para mesclar"
 
+msgid "nothing to rebase"
+msgstr "nada para rebasear"
+
 msgid "use 'hg update' instead"
 msgstr "use 'hg update'"
 
@@ -17615,6 +18081,45 @@
 msgid "use 'hg update' or merge with an explicit revision"
 msgstr "use 'hg update' ou mescle com uma revisão explícita"
 
+msgid "use 'hg update' or rebase to an explicit revision"
+msgstr "use 'hg update' ou mescle com uma revisão explícita"
+
+msgid "source set is empty"
+msgstr "o conjunto de origem é vazio"
+
+msgid "source set is rooted in multiple branches"
+msgstr "a origem cvs não suporta a especificação de múltiplas revisões"
+
+msgid "rebaseset is rooted in multiple named branches"
+msgstr "não é possível colapsar múltiplos ramos nomeados"
+
+msgid "specify an explicit destination with --dest"
+msgstr "você não pode especificar uma revisão com --all"
+
+#, python-format
+msgid "%i other divergent bookmarks for \"%s\"\n"
+msgstr "%i outros marcadores divergentes para \"%s\"\n"
+
+#, python-format
+msgid "no open descendant heads on branch \"%s\", updating to a closed head\n"
+msgstr ""
+"nenhuma cabeça descendente aberta no ramo \"%s\", atualizando para uma "
+"cabeça fechada\n"
+
+#, python-format
+msgid ""
+"(committing will reopen the head, use `hg heads .` to see %i other heads)\n"
+msgstr ""
+"(um commit reabrirá a cabeça, use `hg heads .` para ver %i outras cabeças)\n"
+
+#, python-format
+msgid "(committing will reopen branch \"%s\")\n"
+msgstr "(um commit reabrirá o ramo \"%s\")\n"
+
+#, python-format
+msgid "%i other heads for branch \"%s\"\n"
+msgstr "%i outras cabeças no ramo \"%s\"\n"
+
 msgid "working directory state appears damaged!"
 msgstr "estado do diretório de trabalho parece danificado!"
 
@@ -17633,28 +18138,6 @@
 msgid "setting %r to other parent only allowed in merges"
 msgstr "definir %r para outro pai é permitido apenas em mesclagens"
 
-msgid "unknown"
-msgstr "desconhecido"
-
-msgid "character device"
-msgstr "dispositivo de caracteres"
-
-msgid "block device"
-msgstr "dispositivo de bloco"
-
-msgid "fifo"
-msgstr "fifo"
-
-msgid "socket"
-msgstr "socket"
-
-msgid "directory"
-msgstr "diretório"
-
-#, python-format
-msgid "unsupported file type (type is %s)"
-msgstr "tipo de arquivo não suportado (o tipo é %s)"
-
 #, python-format
 msgid "push creates new remote branches: %s!"
 msgstr "push cria novos ramos remotos: '%s'!"
@@ -17736,6 +18219,9 @@
 msgid "(%s)\n"
 msgstr "(%s)\n"
 
+msgid "interrupted!\n"
+msgstr "interrompido!\n"
+
 msgid "entering debugger - type c to continue starting hg or h for help\n"
 msgstr ""
 "entrando no depurador - digite c para continuar iniciando o hg ou h para "
@@ -17819,49 +18305,9 @@
 msgid "abort: %s: '%s'\n"
 msgstr "abortado: %s: '%s'\n"
 
-msgid "interrupted!\n"
-msgstr "interrompido!\n"
-
 msgid "abort: out of memory\n"
 msgstr "abortado: sem memória\n"
 
-msgid "the extension author."
-msgstr "o autor da extensão."
-
-#, python-format
-msgid ""
-"** Unknown exception encountered with possibly-broken third-party extension %s\n"
-"** which supports versions %s of Mercurial.\n"
-"** Please disable %s and try your action again.\n"
-"** If that fixes the bug please report it to %s\n"
-msgstr ""
-"** Exceção desconhecida encontrada, envolvendo a extensão de terceiros %s,\n"
-"** possivelmente defeituosa, que suporta a versão %s do Mercurial.\n"
-"** Por favor desabilite %s e tente sua ação novamente.\n"
-"** Se isso corrigir o erro, por favor informe-o para %s\n"
-
-msgid "https://mercurial-scm.org/wiki/BugTracker"
-msgstr "https://mercurial-scm.org/wiki/BugTracker"
-
-msgid ""
-"** unknown exception encountered, please report by visiting\n"
-"** "
-msgstr ""
-"** exceção desconhecida encontrada, por favor informe sobre esse erro visitando\n"
-"** "
-
-#, python-format
-msgid "** Python %s\n"
-msgstr "** Python %s\n"
-
-#, python-format
-msgid "** Mercurial Distributed SCM (version %s)\n"
-msgstr "** Mercurial SCM Distribuído (versão %s)\n"
-
-#, python-format
-msgid "** Extensions loaded: %s\n"
-msgstr "** Extensões carregadas: %s\n"
-
 msgid "too few arguments for command alias"
 msgstr "faltam argumentos para o apelido de comando"
 
@@ -17900,10 +18346,6 @@
 msgid "error getting current working directory: %s"
 msgstr "erro obtendo diretório de trabalho atual: %s"
 
-#, python-format
-msgid "extension '%s' overrides commands: %s\n"
-msgstr "a extensão '%s' sobrepõe o comando: %s\n"
-
 msgid "option --config may not be abbreviated!"
 msgstr "a opção --config não pode ser abreviada!"
 
@@ -17961,6 +18403,43 @@
 msgid "unrecognized profiler '%s' - ignored\n"
 msgstr "profiler '%s' não reconhecido - ignorado\n"
 
+msgid "the extension author."
+msgstr "o autor da extensão."
+
+#, python-format
+msgid ""
+"** Unknown exception encountered with possibly-broken third-party extension %s\n"
+"** which supports versions %s of Mercurial.\n"
+"** Please disable %s and try your action again.\n"
+"** If that fixes the bug please report it to %s\n"
+msgstr ""
+"** Exceção desconhecida encontrada, envolvendo a extensão de terceiros %s,\n"
+"** possivelmente defeituosa, que suporta a versão %s do Mercurial.\n"
+"** Por favor desabilite %s e tente sua ação novamente.\n"
+"** Se isso corrigir o erro, por favor informe-o para %s\n"
+
+msgid "https://mercurial-scm.org/wiki/BugTracker"
+msgstr "https://mercurial-scm.org/wiki/BugTracker"
+
+msgid ""
+"** unknown exception encountered, please report by visiting\n"
+"** "
+msgstr ""
+"** exceção desconhecida encontrada, por favor informe sobre esse erro visitando\n"
+"** "
+
+#, python-format
+msgid "** Python %s\n"
+msgstr "** Python %s\n"
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** Mercurial SCM Distribuído (versão %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** Extensões carregadas: %s\n"
+
 msgid "response expected"
 msgstr "resposta esperada"
 
@@ -18211,12 +18690,12 @@
 
 msgid ""
 "``:prompt``\n"
-"Asks the user which of the local or the other version to keep as\n"
-"    the merged version."
+"Asks the user which of the local `p1()` or the other `p2()` version to\n"
+"    keep as the merged version."
 msgstr ""
 "``:prompt``\n"
-"Pergunta ao usuário se a versão local ou a outra deve ser usada\n"
-"    como resultado da mesclagem."
+"Pergunta ao usuário se a versão local `p1()` ou a outra `p2()` deve\n"
+"    ser usada como resultado da mesclagem."
 
 #, python-format
 msgid ""
@@ -18244,17 +18723,17 @@
 
 msgid ""
 "``:local``\n"
-"Uses the local version of files as the merged version."
+"Uses the local `p1()` version of files as the merged version."
 msgstr ""
 "``:local``\n"
-"Usa a versão local de arquivos como resultado da mesclagem."
+"Usa a versão local `p1()` de arquivos como resultado da mesclagem."
 
 msgid ""
 "``:other``\n"
-"Uses the other version of files as the merged version."
+"Uses the other `p2()` version of files as the merged version."
 msgstr ""
 "``:other``\n"
-"Usa a outra (não local) versão de arquivos como resultado da mesclagem."
+"Usa a outra `p2()` versão de arquivos como resultado da mesclagem."
 
 msgid ""
 "``:fail``\n"
@@ -18332,20 +18811,20 @@
 msgid ""
 "``:merge-local``\n"
 "Like :merge, but resolve all conflicts non-interactively in favor\n"
-"    of the local changes."
+"    of the local `p1()` changes."
 msgstr ""
 "``:merge-local``\n"
 "Como :merge, mas resolve de forma não interativa todos os conflitos,\n"
-"    favorecendo mudanças locais."
+"    favorecendo mudanças locais `p1()`."
 
 msgid ""
 "``:merge-other``\n"
 "Like :merge, but resolve all conflicts non-interactively in favor\n"
-"    of the other changes."
+"    of the other `p2()` changes."
 msgstr ""
 "``:merge-other``\n"
 "Como :merge, mas resolve de forma não interativa todos os conflitos,\n"
-"    favorecendo as outras mudanças."
+"    favorecendo as outras `p2()` mudanças."
 
 msgid ""
 "``:tagmerge``\n"
@@ -18768,6 +19247,9 @@
 msgid "representation of revlog data"
 msgstr "representação de dados de revlog"
 
+msgid "repository requirements"
+msgstr "requisitos do repositório"
+
 msgid "revision storage mechanism"
 msgstr "mecanismo de armazenamento de revisões"
 
@@ -18848,6 +19330,10 @@
 msgstr "    %s"
 
 #, python-format
+msgid "defined by: %s\n"
+msgstr "definido por: %s\n"
+
+#, python-format
 msgid "alias for: hg %s"
 msgstr "apelido para: hg %s"
 
@@ -20676,13 +21162,13 @@
 "``outgoing``\n"
 "  Run after sending changes from local repository to another. ID of\n"
 "  first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
-"  ``$HG_SOURCE``; Also see :hg:`help config.preoutgoing` hook."
+"  ``$HG_SOURCE``; Also see :hg:`help config.hooks.preoutgoing` hook."
 msgstr ""
 "``outgoing``\n"
 "  Executado após o envio de mudanças do repositório local para algum outro.\n"
 "  O ID da primeira revisão enviada é passado em ``$HG_NODE``.\n"
 "  A origem da operação é passada em ``$HG_SOURCE``; veja também\n"
-"  hg:`help config.preoutgoing`."
+"  hg:`help config.hooks.preoutgoing`."
 
 msgid ""
 "``post-<command>``\n"
@@ -20865,24 +21351,24 @@
 "``txnclose``\n"
 "  Run after any repository transaction has been committed. At this\n"
 "  point, the transaction can no longer be rolled back. The hook will run\n"
-"  after the lock is released. See :hg:`help config.pretxnclose` docs for\n"
+"  after the lock is released. See :hg:`help config.hooks.pretxnclose` docs for\n"
 "  details about available variables."
 msgstr ""
 "``txnclose``\n"
 "  Executado após qualquer transação do repositório ter sido\n"
 "  consolidada. Neste ponto, a transação não pode mais ser desfeita.\n"
 "  O gancho será executado após o lock ser liberado.\n"
-"  Veja :hg:`help config.pretxnclose` para detalhes sobre variáveis\n"
+"  Veja :hg:`help config.hooks.pretxnclose` para detalhes sobre variáveis\n"
 "  disponíveis."
 
 msgid ""
 "``txnabort``\n"
-"  Run when a transaction is aborted. See :hg:`help config.pretxnclose`\n"
+"  Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`\n"
 "  docs for details about available variables."
 msgstr ""
 "``txnabort``\n"
 "  Executado quando uma transação for abortada.\n"
-"  Veja :hg:`help config.pretxnclose` para detalhes sobre variáveis\n"
+"  Veja :hg:`help config.hooks.pretxnclose` para detalhes sobre variáveis\n"
 "  disponíveis."
 
 msgid ""
@@ -21060,21 +21546,37 @@
 "``hostfingerprints``\n"
 "--------------------"
 
-msgid ""
-"Fingerprints of the certificates of known HTTPS servers.\n"
+msgid "Fingerprints of the certificates of known HTTPS servers."
+msgstr "Impressões digitais dos certificados de servidores HTTPS conhecidos."
+
+msgid ""
 "A HTTPS connection to a server with a fingerprint configured here will\n"
 "only succeed if the servers certificate matches the fingerprint.\n"
-"This is very similar to how ssh known hosts works.\n"
-"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
-"The CA chain and web.cacerts is not used for servers with a fingerprint."
+"This is very similar to how ssh known hosts works."
 msgstr ""
 "Impressões digitais (\"fingerprints\") dos certificados de servidores\n"
 "HTTPS conhecidos.\n"
 "Uma conexão HTTPS com um servidor com uma impressão digital configurada\n"
 "aqui só terá sucesso se o certificado do servidor bater com a impressão.\n"
-"Isto é bastante similar ao mecanismo \"known hosts\" do ssh.\n"
+"Isto é bastante similar ao mecanismo \"known hosts\" do ssh."
+
+msgid ""
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"Multiple values can be specified (separated by spaces or commas). This can\n"
+"be used to define both old and new fingerprints while a host transitions\n"
+"to a new certificate."
+msgstr ""
 "A impressão digital é o valor do hash SHA-1 do certificado codificado\n"
 "em formato DER.\n"
+"Múltiplos valores podem ser especificados, separados por espaços ou\n"
+"vírgulas.\n"
+"Isso pode ser usado para definir tanto impressões antigas\n"
+"como novas, enquanto um servidor faz a transição para um novo\n"
+"certificado."
+
+msgid ""
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
 "A cadeia CA e a opção web.cacerts não são usadas para servidores com\n"
 "impressões digitais configuradas."
 
@@ -21090,16 +21592,10 @@
 "    hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33\n"
 "    hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33"
 
-msgid "This feature is only supported when using Python 2.6 or later."
-msgstr ""
-"Esta funcionalidade só é suportada nas versões do Python 2.6 ou posteriores."
-
-msgid ""
-"\n"
+msgid ""
 "``http_proxy``\n"
 "--------------"
 msgstr ""
-"\n"
 "``http_proxy``\n"
 "--------------"
 
@@ -21152,6 +21648,53 @@
 "    entradas em ``http_proxy.no``. (padrão: False)"
 
 msgid ""
+"``merge``\n"
+"---------"
+msgstr ""
+"``merge``\n"
+"---------"
+
+msgid "This section specifies behavior during merges and updates."
+msgstr ""
+"Esta seção especifica o comportamento durante mesclagens e atualizações."
+
+msgid ""
+"``checkignored``\n"
+"   Controls behavior when an ignored file on disk has the same name as a tracked\n"
+"   file in the changeset being merged or updated to, and has different\n"
+"   contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,\n"
+"   abort on such files. With ``warn``, warn on such files and back them up as\n"
+"   .orig. With ``ignore``, don't print a warning and back them up as\n"
+"   .orig. (default: ``abort``)"
+msgstr ""
+"``checkignored``\n"
+"   Controla o comportamento quando um arquivo ignorado no disco\n"
+"   possuir o mesmo nome que um arquivo rastreado na revisão sendo\n"
+"   mesclada ou atualizada, e possuir conteúdo diferente.\n"
+"   As opções são ``abort``, ``warn`` e ``ignore``.\n"
+"   Com ``abort``, aborta ao encontrar tais arquivos.\n"
+"   Com ``warn``, emite um aviso e cria uma cópia desses arquivos\n"
+"   com a extensão .orig.\n"
+"   Com ``ignore``, não emite um aviso e cria uma cópia com a\n"
+"   extensão .orig.\n"
+"   (padrão: ``abort``)"
+
+msgid ""
+"``checkunknown``\n"
+"   Controls behavior when an unknown file that isn't ignored has the same name\n"
+"   as a tracked file in the changeset being merged or updated to, and has\n"
+"   different contents. Similar to ``merge.checkignored``, except for files that\n"
+"   are not ignored. (default: ``abort``)"
+msgstr ""
+"``checkunknown``\n"
+"   Controla o comportamento quando um arquivo desconhecido que não\n"
+"   for ignorado tiver o mesmo nome que um arquivo rastreado na\n"
+"   revisão sendo mesclada ou atualizada, e possuir conteúdo diferente.\n"
+"   Opera de forma similar a ``merge.checkignored``, mas para arquivos\n"
+"   que não são ignorados.\n"
+"   (padrão: ``abort``)"
+
+msgid ""
 "``merge-patterns``\n"
 "------------------"
 msgstr ""
@@ -22179,6 +22722,18 @@
 "caminho absoluto completo. As regras são aplicadas na ordem de definição."
 
 msgid ""
+"``templatealias``\n"
+"-----------------"
+msgstr ""
+"``templatealias``\n"
+"-----------------"
+
+msgid "Alias definitions for templates. See :hg:`help templates` for details."
+msgstr ""
+"Definições de apelidos para modelos. Veja :hg:`help templates` para\n"
+"mais detalhes."
+
+msgid ""
 "``trusted``\n"
 "-----------"
 msgstr ""
@@ -22451,6 +23006,27 @@
 "    (padrão: True)"
 
 msgid ""
+"``interface``\n"
+"    Select the default interface for interactive features (default: text).\n"
+"    Possible values are 'text' and 'curses'."
+msgstr ""
+"``interface``\n"
+"    Seleciona a interface padrão para funcionalidade interativa (padrão: text).\n"
+"    Os valores possíveis são 'text' e 'curses'."
+
+msgid ""
+"``interface.chunkselector``\n"
+"    Select the interface for change recording (e.g. :hg:`commit` -i).\n"
+"    Possible values are 'text' and 'curses'.\n"
+"    This config overrides the interface specified by ui.interface."
+msgstr ""
+"``interface.chunkselector``\n"
+"    Seleciona a interface para gravar mudanças (por exemplo em :hg:`commit` -i).\n"
+"    Os valores possíveis são 'text' e 'curses'.\n"
+"    Esta configuração se sobrepõe à interface especificada à configuração\n"
+"    ui.interface."
+
+msgid ""
 "``logtemplate``\n"
 "    Template string for commands that print changesets."
 msgstr ""
@@ -22966,17 +23542,6 @@
 "    de servidores HTTPS remotos usando estes certificados."
 
 msgid ""
-"    This feature is only supported when using Python 2.6 or later. If you wish\n"
-"    to use it with earlier versions of Python, install the backported\n"
-"    version of the ssl library that is available from\n"
-"    ``http://pypi.python.org``."
-msgstr ""
-"    Esta funcionalidade só é suportada em versões do Python 2.6 ou\n"
-"    posteriores. Se você quiser usá-la em versões anteriores do Python,\n"
-"    a versão da biblioteca ssl readaptada para versões antigas do Python\n"
-"    disponível em ``http://pypi.python.org``."
-
-msgid ""
 "    To disable SSL verification temporarily, specify ``--insecure`` from\n"
 "    command line."
 msgstr ""
@@ -23408,9 +23973,6 @@
 "final é opcional e indica que a busca não deve ser sensível a\n"
 "maiúsculas e minúsculas."
 
-msgid "Examples::"
-msgstr "Exemplos::"
-
 msgid ""
 "    [websub]\n"
 "    issues = s|issue(\\d+)|<a href=\"http://bts.example.org/issue\\1\">issue\\1</a>|i\n"
@@ -23799,14 +24361,22 @@
 "    ``i18n``\n"
 "        Preserve internationalization.\n"
 "    ``revsetalias``\n"
-"        Don't remove revset aliases."
+"        Don't remove revset aliases.\n"
+"    ``templatealias``\n"
+"        Don't remove template aliases.\n"
+"    ``progress``\n"
+"        Don't hide progress output."
 msgstr ""
 "    ``alias``\n"
 "        Não remove apelidos.\n"
 "    ``i18n``\n"
 "        Preserva internacionalização.\n"
 "    ``revsetalias``\n"
-"        Não remove apelidos de revsets."
+"        Não remove apelidos de revsets.\n"
+"    ``templatealias``\n"
+"        Não remove apelidos de modelos.\n"
+"    ``progress``\n"
+"        Não oculta saída de progresso."
 
 msgid ""
 "    Setting HGPLAINEXCEPT to anything (even an empty string) will\n"
@@ -26612,6 +27182,19 @@
 "  Revisões em x mas não em y."
 
 msgid ""
+"``x % y``\n"
+"  Changesets that are ancestors of x but not ancestors of y (i.e. ::x - ::y).\n"
+"  This is shorthand notation for ``only(x, y)`` (see below). The second\n"
+"  argument is optional and, if left out, is equivalent to ``only(x)``."
+msgstr ""
+"``x % y``\n"
+"  Revisões que são ancestrais de x mas não são ancestrais de y\n"
+"  (ou seja, ::x - ::y).\n"
+"  Esta é uma notação curta para ``only(x, y)`` (veja abaixo).\n"
+"  O segundo argumento é opcional e, se não especificado, é\n"
+"  equivalente a ``only(x)``."
+
+msgid ""
 "``x^n``\n"
 "  The nth parent of x, n == 0, 1, or 2.\n"
 "  For n == 0, x; for n == 1, the first parent of each changeset in x;\n"
@@ -26659,11 +27242,11 @@
 
 msgid ""
 "in the ``revsetalias`` section of a Mercurial configuration file. Arguments\n"
-"of the form `$1`, `$2`, etc. are substituted from the alias into the\n"
+"of the form `a1`, `a2`, etc. are substituted from the alias into the\n"
 "definition."
 msgstr ""
 "na seção ``revsetalias`` de um arquivo de configuração do Mercurial.\n"
-"Argumentos da forma `$1`, `$2`, etc. são substituídos pelos argumentos\n"
+"Argumentos da forma `a1`, `a2`, etc. são substituídos pelos argumentos\n"
 "passados na chamada do apelido."
 
 msgid "For example,"
@@ -26672,13 +27255,13 @@
 msgid ""
 "  [revsetalias]\n"
 "  h = heads()\n"
-"  d($1) = sort($1, date)\n"
-"  rs($1, $2) = reverse(sort($1, $2))"
+"  d(s) = sort(s, date)\n"
+"  rs(s, k) = reverse(sort(s, k))"
 msgstr ""
 "  [revsetalias]\n"
 "  h = heads()\n"
-"  d($1) = sort($1, date)\n"
-"  rs($1, $2) = reverse(sort($1, $2))"
+"  d(s) = sort(s, date)\n"
+"  rs(s, k) = reverse(sort(s, k))"
 
 msgid ""
 "defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is\n"
@@ -26696,10 +27279,10 @@
 
 msgid ""
 "  [revsetalias]\n"
-"  issue($1) = grep(r'\\bissue[ :]?' ## $1 ## r'\\b|\\bbug\\(' ## $1 ## r'\\)')"
+"  issue(a1) = grep(r'\\bissue[ :]?' ## a1 ## r'\\b|\\bbug\\(' ## a1 ## r'\\)')"
 msgstr ""
 "  [revsetalias]\n"
-"  issue($1) = grep(r'\\bissue[ :]?' ## $1 ## r'\\b|\\bbug\\(' ## $1 ## r'\\)')"
+"  issue(a1) = grep(r'\\bissue[ :]?' ## a1 ## r'\\b|\\bbug\\(' ## a1 ## r'\\)')"
 
 msgid ""
 "``issue(1234)`` is equivalent to ``grep(r'\\bissue[ :]?1234\\b|\\bbug\\(1234\\)')``\n"
@@ -26712,11 +27295,11 @@
 
 msgid ""
 "All other prefix, infix and postfix operators have lower priority than\n"
-"``##``. For example, ``$1 ## $2~2`` is equivalent to ``($1 ## $2)~2``."
+"``##``. For example, ``a1 ## a2~2`` is equivalent to ``(a1 ## a2)~2``."
 msgstr ""
 "Todos os outros operadores prefixos, infixos e posfixos têm menor\n"
-"prioridade que ``##``. Por exemplo, ``$1 ## $2~2`` é equivalente\n"
-"a ``($1 ## $2)~2``."
+"prioridade que ``##``. Por exemplo, ``a1 ## a2~2`` é equivalente\n"
+"a ``(a1 ## a2)~2``."
 
 msgid "Command line equivalents for :hg:`log`::"
 msgstr "Opções de linha de comando equivalentes para :hg:`log`::"
@@ -27688,6 +28271,38 @@
 "Para impedir que seja interpretado, você pode usar um caractere de\n"
 "escape ``\\{`` ou um prefixo de string literal ``r'...'``."
 
+msgid ""
+"New keywords and functions can be defined in the ``templatealias`` section of\n"
+"a Mercurial configuration file::"
+msgstr ""
+"Novas palavras-chave e funções podem ser definidas na seção de configuração\n"
+"``templatealias``::"
+
+msgid ""
+"Arguments of the form `a1`, `a2`, etc. are substituted from the alias into\n"
+"the definition."
+msgstr ""
+"Argumentos da forma `a1`, `a2`, etc. são substituídos pelos argumentos\n"
+"passados na chamada do apelido."
+
+msgid ""
+"  [templatealias]\n"
+"  r = rev\n"
+"  rn = \"{r}:{node|short}\"\n"
+"  leftpad(s, w) = pad(s, w, ' ', True)"
+msgstr ""
+"  [templatealias]\n"
+"  r = rev\n"
+"  rn = \"{r}:{node|short}\"\n"
+"  leftpad(s, w) = pad(s, w, ' ', True)"
+
+msgid ""
+"defines two symbol aliases, ``r`` and ``rn``, and a function alias\n"
+"``leftpad()``."
+msgstr ""
+"define dois apelidos de símbolos, ``r`` e ``rn``, e um apelido de função\n"
+"``leftpad()``."
+
 msgid "Some sample command line templates:"
 msgstr "Alguns exemplos de modelos de linha de comando:"
 
@@ -28043,6 +28658,14 @@
 "%d arquivos atualizados, %d arquivos mesclados, %d arquivos removidos, %d "
 "arquivos não resolvidos\n"
 
+#, python-format
+msgid "(leaving bookmark %s)\n"
+msgstr "(mantendo marcador %s)\n"
+
+#, python-format
+msgid "(activating bookmark %s)\n"
+msgstr "(ativando marcador %s)\n"
+
 msgid ""
 "use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
 "abandon\n"
@@ -28057,6 +28680,10 @@
 msgstr "checando links para sub-repositórios\n"
 
 #, python-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
+
+#, python-format
 msgid ".hgsubstate is corrupt in revision %s\n"
 msgstr ".hgsubstate está corrompido na revisão %s\n"
 
@@ -28584,8 +29211,8 @@
 msgstr "websub: expressão regular inválida para %s: %s\n"
 
 #, python-format
-msgid "%s hook is invalid (\"%s\" not in a module)"
-msgstr "gancho %s inválido(\"%s\" não está em um módulo)"
+msgid "%s hook is invalid: \"%s\" not in a module"
+msgstr "gancho %s inválido: \"%s\" não está em um módulo"
 
 msgid "exception from first failed import attempt:\n"
 msgstr "exceção na primeira tentativa de import:\n"
@@ -28593,17 +29220,20 @@
 msgid "exception from second failed import attempt:\n"
 msgstr "exceção na segunda tentativa de import:\n"
 
-#, python-format
-msgid "%s hook is invalid (import of \"%s\" failed)"
-msgstr "gancho %s é inválido (falhou o import de \"%s\")"
-
-#, python-format
-msgid "%s hook is invalid (\"%s\" is not defined)"
-msgstr "gancho %s é inválido (\"%s\" não definido)"
-
-#, python-format
-msgid "%s hook is invalid (\"%s\" is not callable)"
-msgstr "gancho %s é inválido (\"%s\" não é executável)"
+msgid "run with --traceback for stack trace"
+msgstr "execute com --traceback para informações da pilha"
+
+#, python-format
+msgid "%s hook is invalid: import of \"%s\" failed"
+msgstr "gancho %s é inválido: a importação de \"%s\" falhou"
+
+#, python-format
+msgid "%s hook is invalid: \"%s\" is not defined"
+msgstr "gancho %s é inválido: \"%s\" não definido"
+
+#, python-format
+msgid "%s hook is invalid: \"%s\" is not callable"
+msgstr "gancho %s é inválido \"%s\" não é executável"
 
 #, python-format
 msgid "calling hook %s: %s\n"
@@ -28617,6 +29247,9 @@
 msgid "error: %s hook raised an exception: %s\n"
 msgstr "erro: gancho %s lançou uma exceção: %s\n"
 
+msgid "(run with --traceback for stack trace)\n"
+msgstr "(execute com --traceback para informações da pilha)\n"
+
 #, python-format
 msgid "%s hook failed"
 msgstr "gancho %s falhou"
@@ -28638,6 +29271,17 @@
 msgstr "aviso: gancho %s %s\n"
 
 #, python-format
+msgid "untrusted hook %s not executed"
+msgstr "gancho %s não confiável não executado"
+
+msgid "see 'hg help config.trusted'"
+msgstr "veja 'hg help config.trusted'"
+
+#, python-format
+msgid "warning: untrusted hook %s not executed\n"
+msgstr "aviso: gancho %s não confiável não executado\n"
+
+#, python-format
 msgid "loading %s hook failed:\n"
 msgstr "o carregamento do gancho %s falhou:\n"
 
@@ -28801,6 +29445,15 @@
 "aviso: não é possível encontrar o ancestral de '%s' copiado a partir de "
 "'%s'!\n"
 
+msgid "file not found!"
+msgstr "arquivo não encontrado!"
+
+msgid "no match under directory!"
+msgstr "nenhuma correspondência sob o diretório!"
+
+msgid "file not tracked!"
+msgstr "arquivo não rastreado!"
+
 msgid "cannot partially commit a merge (do not specify files or patterns)"
 msgstr ""
 "não é possível consolidar parcialmente uma mesclagem (não especifique "
@@ -28816,15 +29469,6 @@
 msgid "can't commit subrepos without .hgsub"
 msgstr "não é possível consolidar sub-repositórios sem o arquivo .hgsub"
 
-msgid "file not found!"
-msgstr "arquivo não encontrado!"
-
-msgid "no match under directory!"
-msgstr "nenhuma correspondência sob o diretório!"
-
-msgid "file not tracked!"
-msgstr "arquivo não rastreado!"
-
 msgid "cannot commit merge with missing files"
 msgstr "não se pode consolidar uma mesclagem com arquivos ausentes"
 
@@ -29183,6 +29827,38 @@
 "'%(key)s'"
 
 #, python-format
+msgid "at %s: %s"
+msgstr "em %s: %s"
+
+msgid "'$' not for alias arguments"
+msgstr "'$' só deve ser usado em argumentos de apelidos"
+
+msgid "invalid argument list"
+msgstr "lista de argumentos inválida"
+
+msgid "argument names collide with each other"
+msgstr "nomes de argumentos colidem um com o outro"
+
+msgid "invalid format"
+msgstr "formato inválido"
+
+#, python-format
+msgid "failed to parse the declaration of %(section)s \"%(name)s\": %(error)s"
+msgstr "falha ao decodificar a declaração de %(section)s \"%(name)s\": %(error)s"
+
+#, python-format
+msgid "failed to parse the definition of %(section)s \"%(name)s\": %(error)s"
+msgstr "falha ao decodificar a definição de %(section)s \"%(name)s\": %(error)s"
+
+#, python-format
+msgid "infinite expansion of %(section)s \"%(name)s\" detected"
+msgstr "detectada expansão infinita no %(section)s \"%(name)s\""
+
+#, python-format
+msgid "invalid number of arguments: %d"
+msgstr "número de argumentos inválido: %d"
+
+#, python-format
 msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
 msgstr "%d de %d trechos FALHARAM -- gravando rejeitados no arquivo %s\n"
 
@@ -29461,8 +30137,8 @@
 msgid "(not rebuilding fncache because repository does not support fncache)\n"
 msgstr "(fncache não reparado porque o repositório não suporta fncache)\n"
 
-msgid "changeset"
-msgstr "revisão"
+msgid "rebuilding"
+msgstr "reconstruindo"
 
 #, python-format
 msgid "%d items added, %d removed from fncache\n"
@@ -29544,19 +30220,12 @@
 msgid "syntax error in revset '%s'"
 msgstr "erro de sintaxe no revset '%s'"
 
-#, python-format
-msgid "at %s: %s"
-msgstr "em %s: %s"
-
 msgid "see hg help \"revsets.x or y\""
 msgstr "veja hg help \"revsets.x or y\""
 
 msgid "can't use a key-value pair in this context"
 msgstr "não se pode usar um par chave-valor nesse contexto"
 
-msgid "_mergedefaultdest takes no arguments"
-msgstr "_mergedefaultdest não tem argumentos"
-
 msgid ""
 "``adds(pattern)``\n"
 "    Changesets that add a file matching pattern."
@@ -29956,27 +30625,6 @@
 msgid "grep requires a string"
 msgstr "grep requer uma string"
 
-#. i18n: "_matchfiles" is a keyword
-msgid "_matchfiles requires at least one argument"
-msgstr "_matchfiles requer ao menos um argumento"
-
-#. i18n: "_matchfiles" is a keyword
-msgid "_matchfiles requires string arguments"
-msgstr "_matchfiles requer argumentos de texto"
-
-#. i18n: "_matchfiles" is a keyword
-msgid "_matchfiles expected at most one revision"
-msgstr "_matchfiles espera no máximo uma revisão"
-
-#. i18n: "_matchfiles" is a keyword
-msgid "_matchfiles expected at most one default mode"
-msgstr "_matchfiles espera no máximo um modo padrão"
-
-#. i18n: "_matchfiles" is a keyword
-#, python-format
-msgid "invalid _matchfiles prefix: %s"
-msgstr "prefixo _matchfiles inválido: %s"
-
 msgid ""
 "``file(pattern)``\n"
 "    Changesets affecting files matched by pattern."
@@ -30568,33 +31216,8 @@
 msgid "not a symbol"
 msgstr "não é um símbolo"
 
-msgid "'$' not for alias arguments"
-msgstr "'$' só deve ser usado em argumentos de apelidos"
-
-msgid "invalid argument list"
-msgstr "lista de argumentos inválida"
-
-msgid "argument names collide with each other"
-msgstr "nomes de argumentos colidem um com o outro"
-
-msgid "invalid format"
-msgstr "formato inválido"
-
-#, python-format
-msgid "failed to parse the declaration of revset alias \"%s\": %s"
-msgstr "falha ao decodificar a declaração do apelido de revset \"%s\": %s"
-
-#, python-format
-msgid "failed to parse the definition of revset alias \"%s\": %s"
-msgstr "falha ao decodificar a definição do apelido de revset \"%s\": %s"
-
-#, python-format
-msgid "infinite expansion of revset alias \"%s\" detected"
-msgstr "detectada expansão infinita no apelido de revset \"%s\""
-
-#, python-format
-msgid "invalid number of arguments: %d"
-msgstr "número de argumentos inválido: %d"
+msgid "revset alias"
+msgstr "apelido de revset"
 
 #, python-format
 msgid "\"##\" can't concatenate \"%s\" element"
@@ -30672,9 +31295,6 @@
 msgid "queries"
 msgstr "consultas"
 
-msgid "searching"
-msgstr "procurando"
-
 msgid "repository is unrelated"
 msgstr "repositório não é relacionado"
 
@@ -30812,6 +31432,9 @@
 msgid "bundle"
 msgstr "bundle"
 
+msgid "bytes"
+msgstr "bytes"
+
 #, python-format
 msgid "%d files to transfer, %s of data\n"
 msgstr "%d arquivos para transferir, %s de dados\n"
@@ -30943,6 +31566,10 @@
 msgstr "empacotando (%s)"
 
 #, python-format
+msgid "warning: removefiles not implemented (%s)"
+msgstr "aviso: removefiles não implementado (%s)"
+
+#, python-format
 msgid "warning: error \"%s\" in subrepository \"%s\"\n"
 msgstr "aviso: erro \"%s\" no sub-repositório \"%s\"\n"
 
@@ -31326,6 +31953,11 @@
 ":emailuser: Qualquer texto. Devolve a parte do usuário de um endereço de "
 "e-mail."
 
+msgid ":utf8: Any text. Converts from the local character encoding to UTF-8."
+msgstr ""
+":utf8: Qualquer texto. Converte da codificação de caracteres local para "
+"UTF-8."
+
 msgid ":author: String. The unmodified author of the changeset."
 msgstr ":author: String. O autor da revisão, sem modificações."
 
@@ -31542,6 +32174,14 @@
 msgstr "o filtro de modelo '%s' não é compatível com a palavra chave '%s'"
 
 #, python-format
+msgid "keyword '%s' is not iterable"
+msgstr "a palavra chave '%s' não é iterável"
+
+#, python-format
+msgid "%r is not iterable"
+msgstr "%r não é iterável"
+
+#, python-format
 msgid "filter %s expects one argument"
 msgstr "o filtro %s espera um argumento"
 
@@ -31603,6 +32243,10 @@
 msgid "pad() expects two to four arguments"
 msgstr "pad() espera de dois a quatro argumentos"
 
+#. i18n: "pad" is a keyword
+msgid "pad() expects an integer width"
+msgstr "pad() espera um número inteiro como largura"
+
 msgid ""
 ":indent(text, indentchars[, firstline]): Indents all non-empty lines\n"
 "    with the characters given in the indentchars string. An optional\n"
@@ -31683,6 +32327,10 @@
 "    O rótulo pode provocar pós-processamento adicional, por exemplo\n"
 "    coloração automática."
 
+#. i18n: "label" is a keyword
+msgid "label expects two arguments"
+msgstr "label espera dois argumentos"
+
 msgid ""
 ":latesttag([pattern]): The global tags matching the given pattern on the\n"
 "    most recent globally tagged ancestor of this changeset."
@@ -31743,6 +32391,10 @@
 msgid "shortest() expects one or two arguments"
 msgstr "shortest() espera um ou dois argumentos"
 
+#. i18n: "shortest" is a keyword
+msgid "shortest() expects an integer minlength"
+msgstr "shortest() espera um número inteiro como comprimento"
+
 msgid ""
 ":strip(text[, chars]): Strip characters from a string. By default,\n"
 "    strips all leading and trailing whitespace."
@@ -31800,8 +32452,8 @@
 msgid "word expects an integer index"
 msgstr "word espera um índice inteiro"
 
-msgid "unmatched quotes"
-msgstr "aspas não combinam"
+msgid "template alias"
+msgstr "apelido de modelo"
 
 msgid "no templates found, try `hg debuginstall` for more info"
 msgstr ""
@@ -31815,9 +32467,11 @@
 msgid "available styles: %s"
 msgstr "estilos disponíveis: %s"
 
-#, python-format
-msgid "%s: missing value"
-msgstr "%s: valor faltando"
+msgid "missing value"
+msgstr "valor faltando"
+
+msgid "unmatched quotes"
+msgstr "aspas não combinam"
 
 #, python-format
 msgid "\"%s\" not in template map"
@@ -31827,6 +32481,10 @@
 msgid "template file %s: %s"
 msgstr "arquivo de modelo %s: %s"
 
+#, python-format
+msgid "invalid template engine: %s"
+msgstr "motor de modelos inválido: %s"
+
 msgid "cannot use transaction when it is already committed/aborted"
 msgstr "não é possível usar transação quando já estiver consolidada/abortada"
 
@@ -31891,13 +32549,25 @@
 msgid "no username supplied"
 msgstr "nome de usuário não fornecido"
 
-msgid "use \"hg config --edit\" to set your username"
-msgstr "use \"hg config --edit\" para definir seu nome de usuário"
+msgid "use 'hg config --edit' to set your username"
+msgstr "use 'hg config --edit' para definir seu nome de usuário"
 
 #, python-format
 msgid "username %s contains a newline\n"
 msgstr "nome de usuário %s contém quebra de linha\n"
 
+#, python-format
+msgid "invalid value for ui.interface: %s\n"
+msgstr "valor inválido para a opção ui.interface: %s\n"
+
+#, python-format
+msgid "invalid value for ui.interface: %s (using %s)\n"
+msgstr "valor inválido para a opção ui.interface: %s (usando %s)\n"
+
+#, python-format
+msgid "invalid value for ui.interface.%s: %s (using %s)\n"
+msgstr "valor inválido para a opção ui.interface.%s: %s (usando %s)\n"
+
 msgid "unrecognized response\n"
 msgstr "resposta desconhecida\n"
 
@@ -32008,10 +32678,6 @@
 msgstr "data supera 32 bits: %d"
 
 #, python-format
-msgid "negative date value: %d"
-msgstr "valor de data negativo: %d"
-
-#, python-format
 msgid "impossible time zone offset: %d"
 msgstr "fuso horário impossível: %d"
 
@@ -32228,15 +32894,38 @@
 msgstr "checando manifestos\n"
 
 #, python-format
+msgid "%s not in parent-directory manifest"
+msgstr "%s não está no manifesto do diretório pai"
+
+#, python-format
 msgid "%s not in changesets"
 msgstr "%s não está em revisões"
 
-msgid "file without name in manifest"
-msgstr "arquivo sem nome no manifesto"
-
-#, python-format
-msgid "reading manifest delta %s"
-msgstr "lendo delta %s do manifesto"
+msgid "entry without name in manifest"
+msgstr "entrada sem nome no manifesto"
+
+#, python-format
+msgid "reading delta %s"
+msgstr "lendo delta %s"
+
+#, python-format
+msgid "parent-directory manifest refers to unknown revision %s"
+msgstr "revisão se refere a manifesto desconhecido %s"
+
+#, python-format
+msgid "changeset refers to unknown revision %s"
+msgstr "revisão se refere à revisão desconhecida %s"
+
+msgid "checking directory manifests\n"
+msgstr "checando manifestos de diretório\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "impossível decodificar nome de arquivo '%s'"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "atenção: revlog '%s' órfão"
 
 msgid "crosschecking files in changesets and manifests\n"
 msgstr "checagem cruzada de arquivos em revisões e no manifesto\n"
@@ -32244,10 +32933,6 @@
 msgid "crosschecking"
 msgstr "checagem cruzada"
 
-#, python-format
-msgid "changeset refers to unknown manifest %s"
-msgstr "revisão se refere a manifesto desconhecido %s"
-
 msgid "in changeset but not in manifest"
 msgstr "na revisão mas não no manifesto"
 
@@ -32258,10 +32943,6 @@
 msgstr "checando arquivos\n"
 
 #, python-format
-msgid "cannot decode filename '%s'"
-msgstr "impossível decodificar nome de arquivo '%s'"
-
-#, python-format
 msgid "broken revlog! (%s)"
 msgstr "revlog quebrado! (%s)"
 
@@ -32301,12 +32982,8 @@
 msgstr "checando renomeação de %s"
 
 #, python-format
-msgid "%s in manifests not found"
-msgstr "%s não encontrado no manifesto"
-
-#, python-format
-msgid "warning: orphan revlog '%s'"
-msgstr "atenção: revlog '%s' órfão"
+msgid "manifest refers to unknown revision %s"
+msgstr "revisão se refere a manifesto desconhecido %s"
 
 msgid ""
 "incompatible Mercurial client; bundle2 required\n"
@@ -32327,39 +33004,137 @@
 msgid "number of cpus must be an integer"
 msgstr "o número de cpus deve ser um inteiro"
 
-#~ msgid "Check for unrecorded moves at commit time (EXPERIMENTAL)"
-#~ msgstr ""
-#~ "Testa por renomeações não registradas no momento da consolidação "
-#~ "(EXPERIMENTAL)"
-
-#~ msgid ""
-#~ "This extension checks at commit/amend time if any of the committed files\n"
-#~ "comes from an unrecorded mv."
-#~ msgstr ""
-#~ "Esta extensão verifica durante consolidações se algum arquivo consolidado\n"
-#~ "foi renomeado sem registrar essa renomeação pelo comando mv."
-
-#~ msgid ""
-#~ "The threshold at which a file is considered a move can be set with the\n"
-#~ "``automv.similarity`` config option. This option takes a percentage between 0\n"
-#~ "(disabled) and 100 (files must be identical), the default is 95."
-#~ msgstr ""
-#~ "O limiar no qual um arquivo será considerado uma renomeação\n"
-#~ "pode ser definido com a opção de configuração ``automv.similarity``.\n"
-#~ "Esta opção recebe uma porcentagem entre 0 (desabilitado) e 100\n"
-#~ "(os arquivos devem ser idênticos). O valor padrão é 95."
-
-#~ msgid "disable automatic file move detection"
-#~ msgstr "desabilita detecção automática de renomeações"
-
-#~ msgid "automv.similarity must be between 0 and 100"
-#~ msgstr "automv.similarity deve ser um número entre 0 e 100"
-
-#~ msgid "detected move of %s as %s (%d%% similar)\n"
-#~ msgstr "detectada remoção de %s como %s (%d%% de similaridade)\n"
-
-#~ msgid "detected move of %d files\n"
-#~ msgstr "foram detectadas renomeações de %d arquivos\n"
+#~ msgid ""
+#~ "  [blackbox]\n"
+#~ "  track = *"
+#~ msgstr ""
+#~ "  [blackbox]\n"
+#~ "  track = *"
+
+#~ msgid ""
+#~ "'SIGHUP' signal\n"
+#~ "    reload configuration files\n"
+#~ msgstr ""
+#~ "sinal 'SIGHUP'\n"
+#~ "    relê arquivos de configuração\n"
+
+#~ msgid "no histedit in progress"
+#~ msgstr "nenhuma edição de histórico em andamento"
+
+#~ msgid "cannot edit history that would orphan nodes"
+#~ msgstr "não é possível editar histórico de forma a produzir nós órfãos"
+
+#~ msgid "_rebasedefaultdest takes no arguments"
+#~ msgstr "_rebasedefaultdest não tem argumentos"
+
+#~ msgid "no unshelve operation underway"
+#~ msgstr "nenhuma operação unshelve em andamento"
+
+#~ msgid "%s: no key named '%s'"
+#~ msgstr "%s: nenhuma chave nomeada '%s'"
+
+#~ msgid " One or more extensions could not be found"
+#~ msgstr " Uma ou mais extensões não puderam ser encontradas"
+
+#~ msgid " (check that you compiled the extensions)\n"
+#~ msgstr " (verifique se você compilou as extensões)\n"
+
+#~ msgid " No commit editor set and can't find vi in PATH\n"
+#~ msgstr ""
+#~ " Nenhum editor para consolidação configurado, e não foi possível encontrar "
+#~ "'vi' no PATH\n"
+
+#~ msgid " Can't find editor '%s' in PATH\n"
+#~ msgstr " Não é possível localizar editor '%s' no PATH\n"
+
+#~ msgid "no graft state found, can't continue"
+#~ msgstr "estado de graft não encontrado, não é possível continuar"
+
+#~ msgid "apply patch to the nodes from which it was generated"
+#~ msgstr "aplica o patch aos nós a partir dos quais ele foi gerado"
+
+#~ msgid "remove (and delete) file even if added or modified"
+#~ msgstr "remove (e apaga) o arquivo mesmo se foi adicionado ou modificado"
+
+#~ msgid "update across branches if no uncommitted changes"
+#~ msgstr "atualiza através de ramos, se não houverem mudanças pendentes"
+
+#~ msgid ""
+#~ "\n"
+#~ "    to remove '-' lines, make them ' ' lines (context).\n"
+#~ "    to remove '+' lines, delete them.\n"
+#~ "    lines starting with # will be removed from the patch."
+#~ msgstr ""
+#~ "\n"
+#~ "    para remover linhas '-', marque-as como linhas ' ' (contexto).\n"
+#~ "    para remover linhas '+', apague-as.\n"
+#~ "    linhas iniciadas por '#' serão removidas do patch."
+
+#~ msgid ""
+#~ "    if the patch applies cleanly, the edited hunk will immediately be\n"
+#~ "    added to the record list. if it does not apply cleanly, a rejects\n"
+#~ "    file will be generated: you can use that when you try again. if\n"
+#~ "    all lines of the hunk are removed, then the edit is aborted and\n"
+#~ "    the hunk is left unchanged.\n"
+#~ "    "
+#~ msgstr ""
+#~ "    Se o patch aplicar de forma limpa, o trecho editado será adicionado\n"
+#~ "    imediatamente à lista de gravação. Se o patch não aplicar de forma\n"
+#~ "    limpa, um arquivo de rejeitos será gerado: você poderá usar esse\n"
+#~ "    arquivo ao tentar novamente. Se todas as linhas do trecho forem\n"
+#~ "    removidas, a edição será abortada e o trecho não será modificado.\n"
+#~ "    "
+
+#~ msgid "branch %s not found"
+#~ msgstr "ramo %s não encontrado"
+
+#~ msgid "This feature is only supported when using Python 2.6 or later."
+#~ msgstr ""
+#~ "Esta funcionalidade só é suportada nas versões do Python 2.6 ou posteriores."
+
+#~ msgid ""
+#~ "    This feature is only supported when using Python 2.6 or later. If you wish\n"
+#~ "    to use it with earlier versions of Python, install the backported\n"
+#~ "    version of the ssl library that is available from\n"
+#~ "    ``http://pypi.python.org``."
+#~ msgstr ""
+#~ "    Esta funcionalidade só é suportada em versões do Python 2.6 ou\n"
+#~ "    posteriores. Se você quiser usá-la em versões anteriores do Python,\n"
+#~ "    a versão da biblioteca ssl readaptada para versões antigas do Python\n"
+#~ "    disponível em ``http://pypi.python.org``."
+
+#~ msgid "changeset"
+#~ msgstr "revisão"
+
+#~ msgid "_mergedefaultdest takes no arguments"
+#~ msgstr "_mergedefaultdest não tem argumentos"
+
+#~ msgid "_matchfiles requires at least one argument"
+#~ msgstr "_matchfiles requer ao menos um argumento"
+
+#~ msgid "_matchfiles requires string arguments"
+#~ msgstr "_matchfiles requer argumentos de texto"
+
+#~ msgid "_matchfiles expected at most one revision"
+#~ msgstr "_matchfiles espera no máximo uma revisão"
+
+#~ msgid "_matchfiles expected at most one default mode"
+#~ msgstr "_matchfiles espera no máximo um modo padrão"
+
+#~ msgid "invalid _matchfiles prefix: %s"
+#~ msgstr "prefixo _matchfiles inválido: %s"
+
+#~ msgid "negative date value: %d"
+#~ msgstr "valor de data negativo: %d"
+
+#~ msgid "changeset refers to unknown manifest %s"
+#~ msgstr "revisão se refere a manifesto desconhecido %s"
+
+#~ msgid "%s in manifests not found"
+#~ msgstr "%s não encontrado no manifesto"
+
+#~ msgid "[-ac]"
+#~ msgstr "[-ac]"
 
 #~ msgid ""
 #~ "  [blackbox]\n"
@@ -32369,138 +33144,6 @@
 #~ "  [blackbox]\n"
 #~ "  track = *"
 
-#~ msgid "histedit"
-#~ msgstr "histedit"
-
-#~ msgid "rebase"
-#~ msgstr "%d rebaseados"
-
-#~ msgid "nothing to rebase - updating instead\n"
-#~ msgstr "nada para rebasear de %s para %s\n"
-
-#~ msgid "invalid value for --daemon-postexec"
-#~ msgstr "valor %r inválido para a opção %s, int esperado"
-
-#~ msgid "forget added file %s (yn)?$$ &Yes $$ &No"
-#~ msgstr "a mesclagem de '%s' teve sucesso (yn)?$$ (&Y) sim $$ &Não"
-
-#~ msgid "no %s in progress"
-#~ msgstr "nenhum rebaseamento em andamento"
-
-#~ msgid "graft"
-#~ msgstr "força o enxerto"
-
-#~ msgid ""
-#~ "multiple matching bookmarks to rebase - please rebase to an explicit rev or "
-#~ "bookmark"
-#~ msgstr ""
-#~ "múltiplos marcadores para mesclar - por favor mescle com uma revisão ou "
-#~ "marcador explícitos"
-
-#~ msgid ""
-#~ "no matching bookmark to rebase - please rebase to an explicit rev or "
-#~ "bookmark"
-#~ msgstr ""
-#~ "nenhum marcador correspondente para mesclar - por favor mescle com uma "
-#~ "revisão ou marcador explícitos"
-
-#~ msgid "branch '%s' has %d heads - please rebase to an explicit rev"
-#~ msgstr ""
-#~ "o ramo '%s' tem %d cabeças - por favor mescle com uma revisão explícita"
-
-#~ msgid "heads are bookmarked - please rebase to an explicit rev"
-#~ msgstr ""
-#~ "as cabeças estão marcadas com bookmarks - por favor mescle com uma revisão "
-#~ "explícita"
-
-#~ msgid "branch '%s' has one head - please rebase to an explicit rev"
-#~ msgstr ""
-#~ "o ramo '%s' tem apenas uma cabeça - por favor mescle com uma revisão "
-#~ "explícita"
-
-#~ msgid "nothing to rebase"
-#~ msgstr "nada para rebasear\n"
-
-#~ msgid "use 'hg update' or rebase to an explicit revision"
-#~ msgstr "use 'hg update' ou mescle com uma revisão explícita"
-
-#~ msgid "source set is empty"
-#~ msgstr "o patch %s é vazio\n"
-
-#~ msgid "source set is rooted in multiple branches"
-#~ msgstr "a origem cvs não suporta a especificação de múltiplas revisões"
-
-#~ msgid "rebaseset is rooted in multiple named branches"
-#~ msgstr "não é possível colapsar múltiplos ramos nomeados"
-
-#~ msgid "specify an explicit destination with --dest"
-#~ msgstr "você não pode especificar uma revisão com --all"
-
-#~ msgid "%i other divergent bookmarks for \"%s\"\n"
-#~ msgstr "marcador divergente %s guardado como %s\n"
-
-#~ msgid "%i other heads for branch \"%s\"\n"
-#~ msgstr "novas cabeças remotas no ramo '%s':\n"
-
-#~ msgid ""
-#~ "``merge``\n"
-#~ "---------"
-#~ msgstr ""
-#~ "``merge``\n"
-#~ "---------"
-
-#~ msgid "This section specifies behavior during merges and updates."
-#~ msgstr ""
-#~ "Esta seção especifica o comportamento durante mesclagens e atualizações."
-
-#~ msgid ""
-#~ "``checkignored``\n"
-#~ "   Controls behavior when an ignored file on disk has the same name as a tracked\n"
-#~ "   file in the changeset being merged or updated to, and has different\n"
-#~ "   contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,\n"
-#~ "   abort on such files. With ``warn``, warn on such files and back them up as\n"
-#~ "   .orig. With ``ignore``, don't print a warning and back them up as\n"
-#~ "   .orig. (default: ``abort``)"
-#~ msgstr ""
-#~ "``checkignored``\n"
-#~ "   Controla o comportamento quando um arquivo ignorado no disco\n"
-#~ "   possuir o mesmo nome que um arquivo rastreado na revisão sendo\n"
-#~ "   mesclada ou atualizada, e possuir conteúdo diferente.\n"
-#~ "   As opções são ``abort``, ``warn`` e ``ignore``.\n"
-#~ "   Com ``abort``, aborta ao encontrar tais arquivos.\n"
-#~ "   Com ``warn``, emite um aviso e cria uma cópia desses arquivos\n"
-#~ "   com a extensão .orig.\n"
-#~ "   Com ``ignore``, não emite um aviso e cria uma cópia com a\n"
-#~ "   extensão .orig.\n"
-#~ "   (padrão: ``abort``)"
-
-#~ msgid ""
-#~ "``checkunknown``\n"
-#~ "   Controls behavior when an unknown file that isn't ignored has the same name\n"
-#~ "   as a tracked file in the changeset being merged or updated to, and has\n"
-#~ "   different contents. Similar to ``merge.checkignored``, except for files that\n"
-#~ "   are not ignored. (default: ``abort``)"
-#~ msgstr ""
-#~ "``checkunknown``\n"
-#~ "   Controla o comportamento quando um arquivo desconhecido que não\n"
-#~ "   for ignorado tiver o mesmo nome que um arquivo rastreado na\n"
-#~ "   revisão sendo mesclada ou atualizada, e possuir conteúdo diferente.\n"
-#~ "   Opera de forma similar a ``merge.checkignored``, mas para arquivos\n"
-#~ "   que não são ignorados.\n"
-#~ "   (padrão: ``abort``)"
-
-#~ msgid "%s not in parent-directory manifest"
-#~ msgstr "abre o manifesto do diretório"
-
-#~ msgid "parent-directory manifest refers to unknown revision %s"
-#~ msgstr "revisão se refere a manifesto desconhecido %s"
-
-#~ msgid "checking directory manifests\n"
-#~ msgstr "abre o manifesto do diretório"
-
-#~ msgid "manifest refers to unknown revision %s"
-#~ msgstr "revisão se refere a manifesto desconhecido %s"
-
 #~ msgid ""
 #~ "    [hostfingerprints]\n"
 #~ "    hg.intevation.org = fa:1f:d9:48:f1:e7:74:30:38:8d:d8:58:b6:94:b8:58:28:7d:8b:d0"
--- a/mercurial/bdiff.c	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/bdiff.c	Tue May 03 10:41:17 2016 -0500
@@ -103,14 +103,14 @@
 
 	/* clear the hash table */
 	for (i = 0; i <= buckets; i++) {
-		h[i].pos = INT_MAX;
+		h[i].pos = -1;
 		h[i].len = 0;
 	}
 
 	/* add lines to the hash table chains */
-	for (i = bn - 1; i >= 0; i--) {
+	for (i = 0; i < bn; i++) {
 		/* find the equivalence class */
-		for (j = b[i].hash & buckets; h[j].pos != INT_MAX;
+		for (j = b[i].hash & buckets; h[j].pos != -1;
 		     j = (j + 1) & buckets)
 			if (!cmp(b + i, b + h[j].pos))
 				break;
@@ -128,7 +128,7 @@
 	/* match items in a to their equivalence class in b */
 	for (i = 0; i < an; i++) {
 		/* find the equivalence class */
-		for (j = a[i].hash & buckets; h[j].pos != INT_MAX;
+		for (j = a[i].hash & buckets; h[j].pos != -1;
 		     j = (j + 1) & buckets)
 			if (!cmp(a + i, b + h[j].pos))
 				break;
@@ -137,7 +137,7 @@
 		if (h[j].len <= t)
 			a[i].n = h[j].pos; /* point to head of match list */
 		else
-			a[i].n = INT_MAX; /* too popular */
+			a[i].n = -1; /* too popular */
 	}
 
 	/* discard hash tables */
@@ -148,15 +148,23 @@
 static int longest_match(struct line *a, struct line *b, struct pos *pos,
 			 int a1, int a2, int b1, int b2, int *omi, int *omj)
 {
-	int mi = a1, mj = b1, mk = 0, mb = 0, i, j, k;
+	int mi = a1, mj = b1, mk = 0, mb = 0, i, j, k, half;
+
+	/* window our search on large regions to better bound
+	   worst-case performance. by choosing a window at the end, we
+	   reduce skipping overhead on the b chains. */
+	if (a2 - a1 > 30000)
+		a1 = a2 - 30000;
+
+	half = (a1 + a2) / 2;
 
 	for (i = a1; i < a2; i++) {
-		/* skip things before the current block */
-		for (j = a[i].n; j < b1; j = b[j].n)
+		/* skip all lines in b after the current block */
+		for (j = a[i].n; j >= b2; j = b[j].n)
 			;
 
 		/* loop through all lines match a[i] in b */
-		for (; j < b2; j = b[j].n) {
+		for (; j >= b1; j = b[j].n) {
 			/* does this extend an earlier match? */
 			if (i > a1 && j > b1 && pos[j - 1].pos == i - 1)
 				k = pos[j - 1].len + 1;
@@ -165,8 +173,9 @@
 			pos[j].pos = i;
 			pos[j].len = k;
 
-			/* best match so far? */
-			if (k > mk) {
+			/* best match so far? we prefer matches closer
+			   to the middle to balance recursion */
+			if (k > mk || (k == mk && (i <= mi || i < half))) {
 				mi = i;
 				mj = j;
 				mk = k;
@@ -259,27 +268,20 @@
 	/* normalize the hunk list, try to push each hunk towards the end */
 	for (curr = base->next; curr; curr = curr->next) {
 		struct hunk *next = curr->next;
-		int shift = 0;
 
 		if (!next)
 			break;
 
-		if (curr->a2 == next->a1)
-			while (curr->a2 + shift < an && curr->b2 + shift < bn
-			       && !cmp(a + curr->a2 + shift,
-				       b + curr->b2 + shift))
-				shift++;
-		else if (curr->b2 == next->b1)
-			while (curr->b2 + shift < bn && curr->a2 + shift < an
-			       && !cmp(b + curr->b2 + shift,
-				       a + curr->a2 + shift))
-				shift++;
-		if (!shift)
-			continue;
-		curr->b2 += shift;
-		next->b1 += shift;
-		curr->a2 += shift;
-		next->a1 += shift;
+		if (curr->a2 == next->a1 || curr->b2 == next->b1)
+			while (curr->a2 < an && curr->b2 < bn
+			       && next->a1 < next->a2
+			       && next->b1 < next->b2
+			       && !cmp(a + curr->a2, b + curr->b2)) {
+				curr->a2++;
+				next->a1++;
+				curr->b2++;
+				next->b1++;
+			}
 	}
 
 	for (curr = base->next; curr; curr = curr->next)
--- a/mercurial/cmdutil.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/cmdutil.py	Tue May 03 10:41:17 2016 -0500
@@ -2234,20 +2234,26 @@
     formatnode = _graphnodeformatter(ui, displayer)
     state = graphmod.asciistate()
     styles = state['styles']
-    edgetypes = {
-        'parent': graphmod.PARENT,
-        'grandparent': graphmod.GRANDPARENT,
-        'missing': graphmod.MISSINGPARENT
-    }
-    for name, key in edgetypes.items():
-        # experimental config: experimental.graphstyle.*
-        styles[key] = ui.config('experimental', 'graphstyle.%s' % name,
-                                styles[key])
-        if not styles[key]:
-            styles[key] = None
-
-    # experimental config: experimental.graphshorten
-    state['graphshorten'] = ui.configbool('experimental', 'graphshorten')
+
+    # only set graph styling if HGPLAIN is not set.
+    if ui.plain('graph'):
+        # set all edge styles to |, the default pre-3.8 behaviour
+        styles.update(dict.fromkeys(styles, '|'))
+    else:
+        edgetypes = {
+            'parent': graphmod.PARENT,
+            'grandparent': graphmod.GRANDPARENT,
+            'missing': graphmod.MISSINGPARENT
+        }
+        for name, key in edgetypes.items():
+            # experimental config: experimental.graphstyle.*
+            styles[key] = ui.config('experimental', 'graphstyle.%s' % name,
+                                    styles[key])
+            if not styles[key]:
+                styles[key] = None
+
+        # experimental config: experimental.graphshorten
+        state['graphshorten'] = ui.configbool('experimental', 'graphshorten')
 
     for rev, type, ctx, parents in dag:
         char = formatnode(repo, ctx)
--- a/mercurial/commands.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/commands.py	Tue May 03 10:41:17 2016 -0500
@@ -4231,9 +4231,9 @@
                 repo.vfs.write('graftstate', ''.join(nodelines))
                 extra = ''
                 if opts.get('user'):
-                    extra += ' --user %s' % opts['user']
+                    extra += ' --user %s' % util.shellquote(opts['user'])
                 if opts.get('date'):
-                    extra += ' --date %s' % opts['date']
+                    extra += ' --date %s' % util.shellquote(opts['date'])
                 if opts.get('log'):
                     extra += ' --log'
                 hint=_("use 'hg resolve' and 'hg graft --continue%s'") % extra
@@ -7101,8 +7101,7 @@
 
 @command('^update|up|checkout|co',
     [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
-    ('c', 'check', None,
-     _('update across branches if no uncommitted changes')),
+    ('c', 'check', None, _('require clean working directory')),
     ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
     ('r', 'rev', '', _('revision'), _('REV'))
      ] + mergetoolopts,
--- a/mercurial/context.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/context.py	Tue May 03 10:41:17 2016 -0500
@@ -275,9 +275,9 @@
         except error.LookupError:
             return ''
 
-    def sub(self, path):
+    def sub(self, path, allowcreate=True):
         '''return a subrepo for the stored revision of path, never wdir()'''
-        return subrepo.subrepo(self, path)
+        return subrepo.subrepo(self, path, allowcreate=allowcreate)
 
     def nullsub(self, path, pctx):
         return subrepo.nullsubrepo(self, path, pctx)
--- a/mercurial/destutil.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/destutil.py	Tue May 03 10:41:17 2016 -0500
@@ -256,7 +256,7 @@
         },
     }
 
-def _destmergebook(repo, action='merge', sourceset=None):
+def _destmergebook(repo, action='merge', sourceset=None, destspace=None):
     """find merge destination in the active bookmark case"""
     node = None
     bmheads = repo.bookmarkheads(repo._activebookmark)
@@ -275,7 +275,8 @@
     assert node is not None
     return node
 
-def _destmergebranch(repo, action='merge', sourceset=None, onheadcheck=True):
+def _destmergebranch(repo, action='merge', sourceset=None, onheadcheck=True,
+                     destspace=None):
     """find merge destination based on branch heads"""
     node = None
 
@@ -308,6 +309,12 @@
     bheads = list(repo.revs('%ln - (%ld::)', bheads, sourceset))
     # filters out bookmarked heads
     nbhs = list(repo.revs('%ld - bookmark()', bheads))
+
+    if destspace is not None:
+        # restrict search space
+        # used in the 'hg pull --rebase' case, see issue 5214.
+        nbhs = list(repo.revs('%ld and %ld', destspace, nbhs))
+
     if len(nbhs) > 1:
         # Case B: There is more than 1 other anonymous heads
         #
@@ -339,18 +346,22 @@
     assert node is not None
     return node
 
-def destmerge(repo, action='merge', sourceset=None, onheadcheck=True):
+def destmerge(repo, action='merge', sourceset=None, onheadcheck=True,
+              destspace=None):
     """return the default destination for a merge
 
     (or raise exception about why it can't pick one)
 
     :action: the action being performed, controls emitted error message
     """
+    # destspace is here to work around issues with `hg pull --rebase` see
+    # issue5214 for details
     if repo._activebookmark:
-        node = _destmergebook(repo, action=action, sourceset=sourceset)
+        node = _destmergebook(repo, action=action, sourceset=sourceset,
+                              destspace=destspace)
     else:
         node = _destmergebranch(repo, action=action, sourceset=sourceset,
-                                onheadcheck=onheadcheck)
+                                onheadcheck=onheadcheck, destspace=destspace)
     return repo[node].rev()
 
 histeditdefaultrevset = 'reverse(only(.) and not public() and not ::merge())'
--- a/mercurial/exewrapper.c	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/exewrapper.c	Tue May 03 10:41:17 2016 -0500
@@ -96,7 +96,8 @@
 			/* path pyhome exists, let's use it */
 			FindClose(hfind);
 			strcpy_s(pydllfile, sizeof(pydllfile), pyhome);
-			strcat_s(pydllfile, sizeof(pydllfile), "\\" HGPYTHONLIB);
+			strcat_s(pydllfile, sizeof(pydllfile),
+				 "\\" HGPYTHONLIB ".dll");
 			pydll = LoadLibrary(pydllfile);
 			if (pydll == NULL) {
 				err = "failed to load private Python DLL "
@@ -114,7 +115,7 @@
 	}
 
 	if (pydll == NULL) {
-		pydll = LoadLibrary(HGPYTHONLIB);
+		pydll = LoadLibrary(HGPYTHONLIB ".dll");
 		if (pydll == NULL) {
 			err = "failed to load Python DLL " HGPYTHONLIB ".dll";
 			goto bail;
--- a/mercurial/graphmod.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/graphmod.py	Tue May 03 10:41:17 2016 -0500
@@ -401,6 +401,7 @@
     edges = [(nodeidx, nextseen.index(p))
              for p in knownparents if p != nullrev]
 
+    seen[:] = nextseen
     while len(newparents) > 2:
         # ascii() only knows how to add or remove a single column between two
         # calls. Nodes with more than two parents break this constraint so we
@@ -422,7 +423,6 @@
     if len(newparents) > 1:
         edges.append((nodeidx, nodeidx + 1))
     nmorecols = len(nextseen) - ncols
-    seen[:] = nextseen
     # remove current node from edge characters, no longer needed
     state['edges'].pop(rev, None)
     yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
--- a/mercurial/help/revsets.txt	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/help/revsets.txt	Tue May 03 10:41:17 2016 -0500
@@ -42,6 +42,11 @@
 ``x - y``
   Changesets in x but not in y.
 
+``x % y``
+  Changesets that are ancestors of x but not ancestors of y (i.e. ::x - ::y).
+  This is shorthand notation for ``only(x, y)`` (see below). The second
+  argument is optional and, if left out, is equivalent to ``only(x)``.
+
 ``x^n``
   The nth parent of x, n == 0, 1, or 2.
   For n == 0, x; for n == 1, the first parent of each changeset in x;
@@ -66,7 +71,7 @@
   <alias> = <definition>
 
 in the ``revsetalias`` section of a Mercurial configuration file. Arguments
-of the form `$1`, `$2`, etc. are substituted from the alias into the
+of the form `a1`, `a2`, etc. are substituted from the alias into the
 definition.
 
 For example,
@@ -75,8 +80,8 @@
 
   [revsetalias]
   h = heads()
-  d($1) = sort($1, date)
-  rs($1, $2) = reverse(sort($1, $2))
+  d(s) = sort(s, date)
+  rs(s, k) = reverse(sort(s, k))
 
 defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is
 exactly equivalent to ``reverse(sort(0:tip, author))``.
@@ -85,14 +90,14 @@
 one string. For example::
 
   [revsetalias]
-  issue($1) = grep(r'\bissue[ :]?' ## $1 ## r'\b|\bbug\(' ## $1 ## r'\)')
+  issue(a1) = grep(r'\bissue[ :]?' ## a1 ## r'\b|\bbug\(' ## a1 ## r'\)')
 
 ``issue(1234)`` is equivalent to ``grep(r'\bissue[ :]?1234\b|\bbug\(1234\)')``
 in this case. This matches against all of "issue 1234", "issue:1234",
 "issue1234" and "bug(1234)".
 
 All other prefix, infix and postfix operators have lower priority than
-``##``. For example, ``$1 ## $2~2`` is equivalent to ``($1 ## $2)~2``.
+``##``. For example, ``a1 ## a2~2`` is equivalent to ``(a1 ## a2)~2``.
 
 Command line equivalents for :hg:`log`::
 
--- a/mercurial/hg.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/hg.py	Tue May 03 10:41:17 2016 -0500
@@ -886,7 +886,11 @@
             ctx = repo[rev]
             try:
                 for subpath in ctx.substate:
-                    ret = ctx.sub(subpath).verify() or ret
+                    try:
+                        ret = (ctx.sub(subpath, allowcreate=False).verify()
+                               or ret)
+                    except error.RepoError as e:
+                        repo.ui.warn(_('%s: %s\n') % (rev, e))
             except Exception:
                 repo.ui.warn(_('.hgsubstate is corrupt in revision %s\n') %
                              node.short(ctx.node()))
--- a/mercurial/httpclient/__init__.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/httpclient/__init__.py	Tue May 03 10:41:17 2016 -0500
@@ -41,6 +41,7 @@
 # Many functions in this file have too many arguments.
 # pylint: disable=R0913
 
+import cStringIO
 import errno
 import httplib
 import logging
--- a/mercurial/repoview.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/repoview.py	Tue May 03 10:41:17 2016 -0500
@@ -130,13 +130,12 @@
         newhash = cachehash(repo, hideable)
         fh = repo.vfs.open(cachefile, 'w+b', atomictemp=True)
         _writehiddencache(fh, newhash, hidden)
+        fh.close()
     except (IOError, OSError):
         repo.ui.debug('error writing hidden changesets cache\n')
     except error.LockHeld:
         repo.ui.debug('cannot obtain lock to write hidden changesets cache\n')
     finally:
-        if fh:
-            fh.close()
         if wlock:
             wlock.release()
 
--- a/mercurial/revset.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/revset.py	Tue May 03 10:41:17 2016 -0500
@@ -1859,9 +1859,6 @@
 
     s = l[0]
     keys = keys.split()
-    l = []
-    def invert(s):
-        return "".join(chr(255 - ord(c)) for c in s)
     revs = getset(repo, subset, s)
     if keys == ["rev"]:
         revs.sort()
@@ -1869,36 +1866,32 @@
     elif keys == ["-rev"]:
         revs.sort(reverse=True)
         return revs
-    for r in revs:
-        c = repo[r]
-        e = []
-        for k in keys:
-            if k == 'rev':
-                e.append(r)
-            elif k == '-rev':
-                e.append(-r)
-            elif k == 'branch':
-                e.append(c.branch())
-            elif k == '-branch':
-                e.append(invert(c.branch()))
-            elif k == 'desc':
-                e.append(c.description())
-            elif k == '-desc':
-                e.append(invert(c.description()))
-            elif k in 'user author':
-                e.append(c.user())
-            elif k in '-user -author':
-                e.append(invert(c.user()))
-            elif k == 'date':
-                e.append(c.date()[0])
-            elif k == '-date':
-                e.append(-c.date()[0])
-            else:
-                raise error.ParseError(_("unknown sort key %r") % k)
-        e.append(r)
-        l.append(e)
-    l.sort()
-    return baseset([e[-1] for e in l])
+    # sort() is guaranteed to be stable
+    ctxs = [repo[r] for r in revs]
+    for k in reversed(keys):
+        if k == 'rev':
+            ctxs.sort(key=lambda c: c.rev())
+        elif k == '-rev':
+            ctxs.sort(key=lambda c: c.rev(), reverse=True)
+        elif k == 'branch':
+            ctxs.sort(key=lambda c: c.branch())
+        elif k == '-branch':
+            ctxs.sort(key=lambda c: c.branch(), reverse=True)
+        elif k == 'desc':
+            ctxs.sort(key=lambda c: c.description())
+        elif k == '-desc':
+            ctxs.sort(key=lambda c: c.description(), reverse=True)
+        elif k in 'user author':
+            ctxs.sort(key=lambda c: c.user())
+        elif k in '-user -author':
+            ctxs.sort(key=lambda c: c.user(), reverse=True)
+        elif k == 'date':
+            ctxs.sort(key=lambda c: c.date()[0])
+        elif k == '-date':
+            ctxs.sort(key=lambda c: c.date()[0], reverse=True)
+        else:
+            raise error.ParseError(_("unknown sort key %r") % k)
+    return baseset([c.rev() for c in ctxs])
 
 @predicate('subrepo([pattern])')
 def subrepo(repo, subset, x):
--- a/mercurial/scmutil.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/scmutil.py	Tue May 03 10:41:17 2016 -0500
@@ -539,7 +539,7 @@
             # to a directory. Let the posixfile() call below raise IOError.
             if basename:
                 if atomictemp:
-                    util.ensuredirs(dirname, self.createmode, notindexed)
+                    util.makedirs(dirname, self.createmode, notindexed)
                     return util.atomictempfile(f, mode, self.createmode)
                 try:
                     if 'w' in mode:
@@ -556,7 +556,7 @@
                     if e.errno != errno.ENOENT:
                         raise
                     nlink = 0
-                    util.ensuredirs(dirname, self.createmode, notindexed)
+                    util.makedirs(dirname, self.createmode, notindexed)
                 if nlink > 0:
                     if self._trustnlink is None:
                         self._trustnlink = nlink > 1 or util.checknlink(f)
@@ -583,7 +583,7 @@
         except OSError:
             pass
 
-        util.ensuredirs(os.path.dirname(linkname), self.createmode)
+        util.makedirs(os.path.dirname(linkname), self.createmode)
 
         if self._cansymlink:
             try:
--- a/mercurial/sslutil.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/sslutil.py	Tue May 03 10:41:17 2016 -0500
@@ -120,9 +120,6 @@
       server (and client) support SNI, this tells the server which certificate
       to use.
     """
-    if not serverhostname:
-        raise error.Abort('serverhostname argument required')
-
     # Despite its name, PROTOCOL_SSLv23 selects the highest protocol
     # that both ends support, including TLS protocols. On legacy stacks,
     # the highest it likely goes in TLS 1.0. On modern stacks, it can
--- a/mercurial/subrepo.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/subrepo.py	Tue May 03 10:41:17 2016 -0500
@@ -340,7 +340,7 @@
                           "in '%s'\n") % vfs.join(dirname))
                 vfs.unlink(vfs.reljoin(dirname, f))
 
-def subrepo(ctx, path, allowwdir=False):
+def subrepo(ctx, path, allowwdir=False, allowcreate=True):
     """return instance of the right subrepo class for subrepo in path"""
     # subrepo inherently violates our import layering rules
     # because it wants to make repo objects from deep inside the stack
@@ -356,7 +356,7 @@
         raise error.Abort(_('unknown subrepo type %s') % state[2])
     if allowwdir:
         state = (state[0], ctx.subrev(path), state[2])
-    return types[state[2]](ctx, path, state[:2])
+    return types[state[2]](ctx, path, state[:2], allowcreate)
 
 def nullsubrepo(ctx, path, pctx):
     """return an empty subrepo in pctx for the extant subrepo in ctx"""
@@ -375,7 +375,7 @@
     subrev = ''
     if state[2] == 'hg':
         subrev = "0" * 40
-    return types[state[2]](pctx, path, (state[0], subrev))
+    return types[state[2]](pctx, path, (state[0], subrev), True)
 
 def newcommitphase(ui, ctx):
     commitphase = phases.newcommitphase(ui)
@@ -611,12 +611,12 @@
         return self.wvfs.reljoin(reporelpath(self._ctx.repo()), self._path)
 
 class hgsubrepo(abstractsubrepo):
-    def __init__(self, ctx, path, state):
+    def __init__(self, ctx, path, state, allowcreate):
         super(hgsubrepo, self).__init__(ctx, path)
         self._state = state
         r = ctx.repo()
         root = r.wjoin(path)
-        create = not r.wvfs.exists('%s/.hg' % path)
+        create = allowcreate and not r.wvfs.exists('%s/.hg' % path)
         self._repo = hg.repository(r.baseui, root, create=create)
 
         # Propagate the parent's --hidden option
@@ -1064,7 +1064,7 @@
         return reporelpath(self._repo)
 
 class svnsubrepo(abstractsubrepo):
-    def __init__(self, ctx, path, state):
+    def __init__(self, ctx, path, state, allowcreate):
         super(svnsubrepo, self).__init__(ctx, path)
         self._state = state
         self._exe = util.findexe('svn')
@@ -1284,7 +1284,7 @@
 
 
 class gitsubrepo(abstractsubrepo):
-    def __init__(self, ctx, path, state):
+    def __init__(self, ctx, path, state, allowcreate):
         super(gitsubrepo, self).__init__(ctx, path)
         self._state = state
         self._abspath = ctx.repo().wjoin(path)
--- a/mercurial/tags.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/tags.py	Tue May 03 10:41:17 2016 -0500
@@ -16,7 +16,6 @@
 import errno
 import time
 
-from .i18n import _
 from .node import (
     bin,
     hex,
@@ -176,8 +175,8 @@
     hextaglines = util.sortdict()
     count = 0
 
-    def warn(msg):
-        ui.warn(_("%s, line %s: %s\n") % (fn, count, msg))
+    def dbg(msg):
+        ui.debug("%s, line %s: %s\n" % (fn, count, msg))
 
     for nline, line in enumerate(lines):
         count += 1
@@ -186,7 +185,7 @@
         try:
             (nodehex, name) = line.split(" ", 1)
         except ValueError:
-            warn(_("cannot parse entry"))
+            dbg("cannot parse entry")
             continue
         name = name.strip()
         if recode:
@@ -194,7 +193,7 @@
         try:
             nodebin = bin(nodehex)
         except TypeError:
-            warn(_("node '%s' is not well formed") % nodehex)
+            dbg("node '%s' is not well formed" % nodehex)
             continue
 
         # update filetags
@@ -433,7 +432,10 @@
 
         self._raw = array('c')
 
-        data = repo.vfs.tryread(_fnodescachefile)
+        try:
+            data = repo.vfs.read(_fnodescachefile)
+        except (OSError, IOError):
+            data = ""
         self._raw.fromstring(data)
 
         # The end state of self._raw is an array that is of the exact length
--- a/mercurial/templates/map-cmdline.status	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/templates/map-cmdline.status	Tue May 03 10:41:17 2016 -0500
@@ -8,18 +8,13 @@
 # Override the file templates
 lfiles = '{if(files,
               label('ui.note log.files',
-                    'files:\n'))}{lfile_mods}{lfile_adds}{lfile_copies_switch}{lfile_dels}'
+                    'files:\n'))}{lfile_mods}{lfile_adds}{lfile_dels}'
 
-# Exclude copied files, will display those in lfile_copies_switch
-lfile_adds  = '{file_adds % "{ifcontains(file, file_copies_switch,
-                                         '',
-                                         '{lfile_add}')}"}'
+lfile_adds = '{file_adds % "{lfile_add}{lfile_src}"}'
+lfile_mods = '{file_mods % "{lfile_mod}{lfile_src}"}'
 lfile_add = '{label("status.added", "A {file}\n")}'
-
-lfile_copies_switch = '{file_copies_switch % "{lfile_copy_orig}{lfile_copy_dest}"}'
-lfile_copy_orig = '{label("status.added", "A {name}\n")}'
-lfile_copy_dest = '{label("status.copied", "  {source}\n")}'
-
-lfile_mods = '{file_mods % "{label('status.modified', 'M {file}\n')}"}'
+lfile_mod = '{label("status.modified", "M {file}\n")}'
+lfile_src = '{ifcontains(file, file_copies_switch,
+              label("status.copied", "  {get(file_copies_switch, file)}\n"))}'
 
 lfile_dels = '{file_dels % "{label('status.removed', 'R {file}\n')}"}'
--- a/mercurial/util.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/mercurial/util.py	Tue May 03 10:41:17 2016 -0500
@@ -1420,7 +1420,12 @@
             self.discard()
 
 def makedirs(name, mode=None, notindexed=False):
-    """recursive directory creation with parent mode inheritance"""
+    """recursive directory creation with parent mode inheritance
+
+    Newly created directories are marked as "not to be indexed by
+    the content indexing service", if ``notindexed`` is specified
+    for "write" mode access.
+    """
     try:
         makedir(name, notindexed)
     except OSError as err:
@@ -1432,29 +1437,13 @@
         if parent == name:
             raise
         makedirs(parent, mode, notindexed)
-        makedir(name, notindexed)
-    if mode is not None:
-        os.chmod(name, mode)
-
-def ensuredirs(name, mode=None, notindexed=False):
-    """race-safe recursive directory creation
-
-    Newly created directories are marked as "not to be indexed by
-    the content indexing service", if ``notindexed`` is specified
-    for "write" mode access.
-    """
-    if os.path.isdir(name):
-        return
-    parent = os.path.dirname(os.path.abspath(name))
-    if parent != name:
-        ensuredirs(parent, mode, notindexed)
-    try:
-        makedir(name, notindexed)
-    except OSError as err:
-        if err.errno == errno.EEXIST and os.path.isdir(name):
-            # someone else seems to have won a directory creation race
-            return
-        raise
+        try:
+            makedir(name, notindexed)
+        except OSError as err:
+            # Catch EEXIST to handle races
+            if err.errno == errno.EEXIST:
+                return
+            raise
     if mode is not None:
         os.chmod(name, mode)
 
--- a/setup.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/setup.py	Tue May 03 10:41:17 2016 -0500
@@ -57,6 +57,7 @@
 
 ispypy = "PyPy" in sys.version
 
+import ctypes
 import os, stat, subprocess, time
 import re
 import shutil
@@ -369,8 +370,34 @@
         if isinstance(self.compiler, HackedMingw32CCompiler):
             self.compiler.compiler_so = self.compiler.compiler # no -mdll
             self.compiler.dll_libraries = [] # no -lmsrvc90
-        hv = sys.hexversion
-        pythonlib = 'python%d%d' % (hv >> 24, (hv >> 16) & 0xff)
+
+        # Different Python installs can have different Python library
+        # names. e.g. the official CPython distribution uses pythonXY.dll
+        # and MinGW uses libpythonX.Y.dll.
+        _kernel32 = ctypes.windll.kernel32
+        _kernel32.GetModuleFileNameA.argtypes = [ctypes.c_void_p,
+                                                 ctypes.c_void_p,
+                                                 ctypes.c_ulong]
+        _kernel32.GetModuleFileNameA.restype = ctypes.c_ulong
+        size = 1000
+        buf = ctypes.create_string_buffer(size + 1)
+        filelen = _kernel32.GetModuleFileNameA(sys.dllhandle, ctypes.byref(buf),
+                                               size)
+
+        if filelen > 0 and filelen != size:
+            dllbasename = os.path.basename(buf.value)
+            if not dllbasename.lower().endswith('.dll'):
+                raise SystemExit('Python DLL does not end with .dll: %s' %
+                                 dllbasename)
+            pythonlib = dllbasename[:-4]
+        else:
+            log.warn('could not determine Python DLL filename; '
+                     'assuming pythonXY')
+
+            hv = sys.hexversion
+            pythonlib = 'python%d%d' % (hv >> 24, (hv >> 16) & 0xff)
+
+        log.info('using %s as Python library name' % pythonlib)
         with open('mercurial/hgpythonlib.h', 'wb') as f:
             f.write('/* this file is autogenerated by setup.py */\n')
             f.write('#define HGPYTHONLIB "%s"\n' % pythonlib)
--- a/tests/hghave.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/hghave.py	Tue May 03 10:41:17 2016 -0500
@@ -456,6 +456,19 @@
 def has_osx():
     return sys.platform == 'darwin'
 
+@check("osxpackaging", "OS X packaging tools")
+def has_osxpackaging():
+    try:
+        return (matchoutput('pkgbuild', 'Usage: pkgbuild ', ignorestatus=1)
+                and matchoutput(
+                    'productbuild', 'Usage: productbuild ',
+                    ignorestatus=1)
+                and matchoutput('lsbom', 'Usage: lsbom', ignorestatus=1)
+                and matchoutput(
+                    'xar --help', 'Usage: xar', ignorestatus=1))
+    except ImportError:
+        return False
+
 @check("docker", "docker support")
 def has_docker():
     pat = r'A self-sufficient runtime for'
--- a/tests/test-bdiff.py	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-bdiff.py	Tue May 03 10:41:17 2016 -0500
@@ -52,6 +52,9 @@
         pos += l
 showdiff("x\n\nx\n\nx\n\nx\n\nz\n", "x\n\nx\n\ny\n\nx\n\nx\n\nz\n")
 showdiff("x\n\nx\n\nx\n\nx\n\nz\n", "x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n")
+# we should pick up abbbc. rather than bc.de as the longest match
+showdiff("a\nb\nb\nb\nc\n.\nd\ne\n.\nf\n",
+         "a\nb\nb\na\nb\nb\nb\nc\n.\nb\nc\n.\nd\ne\nf\n")
 
 print("done")
 
--- a/tests/test-bdiff.py.out	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-bdiff.py.out	Tue May 03 10:41:17 2016 -0500
@@ -20,5 +20,8 @@
 6 6 'y\n\n'
 6 6 'y\n\n'
 9 9 'y\n\n'
+0 0 'a\nb\nb\n'
+12 12 'b\nc\n.\n'
+16 18 ''
 done
 done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-cache-abuse.t	Tue May 03 10:41:17 2016 -0500
@@ -0,0 +1,100 @@
+Enable obsolete markers
+
+  $ cat >> $HGRCPATH << EOF
+  > [experimental]
+  > evolution=createmarkers
+  > [phases]
+  > publish=False
+  > EOF
+
+Build a repo with some cacheable bits:
+
+  $ hg init a
+  $ cd a
+
+  $ echo a > a
+  $ hg ci -qAm0
+  $ hg tag t1
+  $ hg book -i bk1
+
+  $ hg branch -q b2
+  $ hg ci -Am1
+  $ hg tag t2
+
+  $ echo dumb > dumb
+  $ hg ci -qAmdumb
+  $ hg debugobsolete b1174d11b69e63cb0c5726621a43c859f0858d7f
+
+  $ hg phase -pr t1
+  $ hg phase -fsr t2
+
+Make a helper function to check cache damage invariants:
+
+- command output shouldn't change
+- cache should be present after first use
+- corruption/repair should be silent (no exceptions or warnings)
+- cache should survive deletion, overwrite, and append
+- unreadable / unwriteable caches should be ignored
+- cache should be rebuilt after corruption
+
+  $ damage() {
+  >  CMD=$1
+  >  CACHE=.hg/cache/$2
+  >  CLEAN=$3
+  >  hg $CMD > before
+  >  test -f $CACHE || echo "not present"
+  >  echo bad > $CACHE
+  >  test -z "$CLEAN" || $CLEAN
+  >  hg $CMD > after
+  >  diff -u before after || echo "*** overwrite corruption"
+  >  echo corruption >> $CACHE
+  >  test -z "$CLEAN" || $CLEAN
+  >  hg $CMD > after
+  >  diff -u before after || echo "*** append corruption"
+  >  rm $CACHE
+  >  mkdir $CACHE
+  >  test -z "$CLEAN" || $CLEAN
+  >  hg $CMD > after
+  >  diff -u before after || echo "*** read-only corruption"
+  >  test -d $CACHE || echo "*** directory clobbered"
+  >  rmdir $CACHE
+  >  test -z "$CLEAN" || $CLEAN
+  >  hg $CMD > after
+  >  diff -u before after || echo "*** missing corruption"
+  >  test -f $CACHE || echo "not rebuilt"
+  > }
+
+Beat up tags caches:
+
+  $ damage "tags --hidden" tags2
+  $ damage tags tags2-visible
+  $ damage "tag -f t3" hgtagsfnodes1
+
+Beat up hidden cache:
+
+  $ damage log hidden
+
+Beat up branch caches:
+
+  $ damage branches branch2-base "rm .hg/cache/branch2-[vs]*"
+  $ damage branches branch2-served "rm .hg/cache/branch2-[bv]*"
+  $ damage branches branch2-visible
+  $ damage "log -r branch(.)" rbc-names-v1
+  $ damage "log -r branch(default)" rbc-names-v1
+  $ damage "log -r branch(b2)" rbc-revs-v1
+
+We currently can't detect an rbc cache with unknown names:
+
+  $ damage "log -qr branch(b2)" rbc-names-v1
+  --- before	* (glob)
+  +++ after	* (glob)
+  @@ -1,8 +0,0 @@
+  -2:5fb7d38b9dc4
+  -3:60b597ffdafa
+  -4:b1174d11b69e
+  -5:6354685872c0
+  -6:5ebc725f1bef
+  -7:7b76eec2f273
+  -8:ef3428d9d644
+  -9:ba7a936bc03c
+  *** append corruption
--- a/tests/test-commandserver.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-commandserver.t	Tue May 03 10:41:17 2016 -0500
@@ -182,6 +182,7 @@
   ui.slash=True
   ui.interactive=False
   ui.mergemarkers=detailed
+  ui.usehttp2=true (?)
   ui.foo=bar
   ui.nontty=true
   *** runcommand init foo
@@ -193,6 +194,7 @@
   ui.slash=True
   ui.interactive=False
   ui.mergemarkers=detailed
+  ui.usehttp2=true (?)
   ui.nontty=true
 
   $ rm -R foo
--- a/tests/test-convert-git.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-convert-git.t	Tue May 03 10:41:17 2016 -0500
@@ -714,7 +714,7 @@
   $ COMMIT_OBJ=1c/0ce3c5886f83a1d78a7b517cdff5cf9ca17bdd
   $ mv git-repo4/.git/objects/$COMMIT_OBJ git-repo4/.git/objects/$COMMIT_OBJ.tmp
   $ hg convert git-repo4 git-repo4-broken-hg 2>&1 | grep 'abort:'
-  abort: cannot retrieve number of commits in git-repo4/.git
+  abort: cannot retrieve number of commits in $TESTTMP/git-repo4/.git
   $ mv git-repo4/.git/objects/$COMMIT_OBJ.tmp git-repo4/.git/objects/$COMMIT_OBJ
 damage git repository by renaming a blob object
 
@@ -749,5 +749,22 @@
   $ test -f COMMAND-INJECTION
   [1]
 
+test for safely passing paths to git (CVE-2016-3105)
+
+  $ git init 'ext::sh -c echo% pwned% >GIT-EXT-COMMAND-INJECTION% #'
+  Initialized empty Git repository in $TESTTMP/ext::sh -c echo% pwned% >GIT-EXT-COMMAND-INJECTION% #/.git/
+  $ cd 'ext::sh -c echo% pwned% >GIT-EXT-COMMAND-INJECTION% #'
+  $ git commit -q --allow-empty -m 'empty'
+  $ cd ..
+  $ hg convert 'ext::sh -c echo% pwned% >GIT-EXT-COMMAND-INJECTION% #' 'converted-git-ext'
+  initializing destination converted-git-ext repository
+  scanning source...
+  sorting...
+  converting...
+  0 empty
+  updating bookmarks
+  $ test -f GIT-EXT-COMMAND-INJECTION
+  [1]
+
 #endif
 
--- a/tests/test-convert.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-convert.t	Tue May 03 10:41:17 2016 -0500
@@ -422,7 +422,7 @@
   assuming destination emptydir-hg
   initializing destination emptydir-hg repository
   emptydir does not look like a CVS checkout
-  emptydir does not look like a Git repository
+  $TESTTMP/emptydir does not look like a Git repository
   emptydir does not look like a Subversion repository
   emptydir is not a local Mercurial repository
   emptydir does not look like a darcs repository
--- a/tests/test-glog.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-glog.t	Tue May 03 10:41:17 2016 -0500
@@ -2633,6 +2633,410 @@
        summary:     (4) merge two known; one immediate left, one immediate right
   
 
+Setting HGPLAIN ignores graphmod styling:
+
+  $ HGPLAIN=1 hg log -G -r 'file("a")' -m
+  @  changeset:   36:08a19a744424
+  |  branch:      branch
+  |  tag:         tip
+  |  parent:      35:9159c3644c5e
+  |  parent:      35:9159c3644c5e
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:36 1970 +0000
+  |  summary:     (36) buggy merge: identical parents
+  |
+  o    changeset:   32:d06dffa21a31
+  |\   parent:      27:886ed638191b
+  | |  parent:      31:621d83e11f67
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:32 1970 +0000
+  | |  summary:     (32) expand
+  | |
+  o |  changeset:   31:621d83e11f67
+  |\|  parent:      21:d42a756af44d
+  | |  parent:      30:6e11cd4b648f
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:31 1970 +0000
+  | |  summary:     (31) expand
+  | |
+  o |    changeset:   30:6e11cd4b648f
+  |\ \   parent:      28:44ecd0b9ae99
+  | | |  parent:      29:cd9bb2be7593
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:30 1970 +0000
+  | | |  summary:     (30) expand
+  | | |
+  o | |    changeset:   28:44ecd0b9ae99
+  |\ \ \   parent:      1:6db2ef61d156
+  | | | |  parent:      26:7f25b6c2f0b9
+  | | | |  user:        test
+  | | | |  date:        Thu Jan 01 00:00:28 1970 +0000
+  | | | |  summary:     (28) merge zero known
+  | | | |
+  o | | |    changeset:   26:7f25b6c2f0b9
+  |\ \ \ \   parent:      18:1aa84d96232a
+  | | | | |  parent:      25:91da8ed57247
+  | | | | |  user:        test
+  | | | | |  date:        Thu Jan 01 00:00:26 1970 +0000
+  | | | | |  summary:     (26) merge one known; far right
+  | | | | |
+  | o-----+  changeset:   25:91da8ed57247
+  | | | | |  parent:      21:d42a756af44d
+  | | | | |  parent:      24:a9c19a3d96b7
+  | | | | |  user:        test
+  | | | | |  date:        Thu Jan 01 00:00:25 1970 +0000
+  | | | | |  summary:     (25) merge one known; far left
+  | | | | |
+  | o | | |    changeset:   24:a9c19a3d96b7
+  | |\ \ \ \   parent:      0:e6eb3150255d
+  | | | | | |  parent:      23:a01cddf0766d
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:24 1970 +0000
+  | | | | | |  summary:     (24) merge one known; immediate right
+  | | | | | |
+  | o---+ | |  changeset:   23:a01cddf0766d
+  | | | | | |  parent:      1:6db2ef61d156
+  | | | | | |  parent:      22:e0d9cccacb5d
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:23 1970 +0000
+  | | | | | |  summary:     (23) merge one known; immediate left
+  | | | | | |
+  | o-------+  changeset:   22:e0d9cccacb5d
+  | | | | | |  parent:      18:1aa84d96232a
+  |/ / / / /   parent:      21:d42a756af44d
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:22 1970 +0000
+  | | | | |    summary:     (22) merge two known; one far left, one far right
+  | | | | |
+  | | | | o    changeset:   21:d42a756af44d
+  | | | | |\   parent:      19:31ddc2c1573b
+  | | | | | |  parent:      20:d30ed6450e32
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:21 1970 +0000
+  | | | | | |  summary:     (21) expand
+  | | | | | |
+  +-+-------o  changeset:   20:d30ed6450e32
+  | | | | |    parent:      0:e6eb3150255d
+  | | | | |    parent:      18:1aa84d96232a
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:20 1970 +0000
+  | | | | |    summary:     (20) merge two known; two far right
+  | | | | |
+  | | | | o    changeset:   19:31ddc2c1573b
+  | | | | |\   parent:      15:1dda3f72782d
+  | | | | | |  parent:      17:44765d7c06e0
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:19 1970 +0000
+  | | | | | |  summary:     (19) expand
+  | | | | | |
+  o---+---+ |  changeset:   18:1aa84d96232a
+    | | | | |  parent:      1:6db2ef61d156
+   / / / / /   parent:      15:1dda3f72782d
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:18 1970 +0000
+  | | | | |    summary:     (18) merge two known; two far left
+  | | | | |
+  | | | | o    changeset:   17:44765d7c06e0
+  | | | | |\   parent:      12:86b91144a6e9
+  | | | | | |  parent:      16:3677d192927d
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:17 1970 +0000
+  | | | | | |  summary:     (17) expand
+  | | | | | |
+  +-+-------o  changeset:   16:3677d192927d
+  | | | | |    parent:      0:e6eb3150255d
+  | | | | |    parent:      1:6db2ef61d156
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:16 1970 +0000
+  | | | | |    summary:     (16) merge two known; one immediate right, one near right
+  | | | | |
+  | | | o |    changeset:   15:1dda3f72782d
+  | | | |\ \   parent:      13:22d8966a97e3
+  | | | | | |  parent:      14:8eac370358ef
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:15 1970 +0000
+  | | | | | |  summary:     (15) expand
+  | | | | | |
+  +-------o |  changeset:   14:8eac370358ef
+  | | | | |/   parent:      0:e6eb3150255d
+  | | | | |    parent:      12:86b91144a6e9
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:14 1970 +0000
+  | | | | |    summary:     (14) merge two known; one immediate right, one far right
+  | | | | |
+  | | | o |    changeset:   13:22d8966a97e3
+  | | | |\ \   parent:      9:7010c0af0a35
+  | | | | | |  parent:      11:832d76e6bdf2
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:13 1970 +0000
+  | | | | | |  summary:     (13) expand
+  | | | | | |
+  | +---+---o  changeset:   12:86b91144a6e9
+  | | | | |    parent:      1:6db2ef61d156
+  | | | | |    parent:      9:7010c0af0a35
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:12 1970 +0000
+  | | | | |    summary:     (12) merge two known; one immediate right, one far left
+  | | | | |
+  | | | | o    changeset:   11:832d76e6bdf2
+  | | | | |\   parent:      6:b105a072e251
+  | | | | | |  parent:      10:74c64d036d72
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:11 1970 +0000
+  | | | | | |  summary:     (11) expand
+  | | | | | |
+  +---------o  changeset:   10:74c64d036d72
+  | | | | |/   parent:      0:e6eb3150255d
+  | | | | |    parent:      6:b105a072e251
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:10 1970 +0000
+  | | | | |    summary:     (10) merge two known; one immediate left, one near right
+  | | | | |
+  | | | o |    changeset:   9:7010c0af0a35
+  | | | |\ \   parent:      7:b632bb1b1224
+  | | | | | |  parent:      8:7a0b11f71937
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:09 1970 +0000
+  | | | | | |  summary:     (9) expand
+  | | | | | |
+  +-------o |  changeset:   8:7a0b11f71937
+  | | | |/ /   parent:      0:e6eb3150255d
+  | | | | |    parent:      7:b632bb1b1224
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:08 1970 +0000
+  | | | | |    summary:     (8) merge two known; one immediate left, one far right
+  | | | | |
+  | | | o |    changeset:   7:b632bb1b1224
+  | | | |\ \   parent:      2:3d9a33b8d1e1
+  | | | | | |  parent:      5:4409d547b708
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:07 1970 +0000
+  | | | | | |  summary:     (7) expand
+  | | | | | |
+  | | | +---o  changeset:   6:b105a072e251
+  | | | | |/   parent:      2:3d9a33b8d1e1
+  | | | | |    parent:      5:4409d547b708
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:06 1970 +0000
+  | | | | |    summary:     (6) merge two known; one immediate left, one far left
+  | | | | |
+  | | | o |    changeset:   5:4409d547b708
+  | | | |\ \   parent:      3:27eef8ed80b4
+  | | | | | |  parent:      4:26a8bac39d9f
+  | | | | | |  user:        test
+  | | | | | |  date:        Thu Jan 01 00:00:05 1970 +0000
+  | | | | | |  summary:     (5) expand
+  | | | | | |
+  | +---o | |  changeset:   4:26a8bac39d9f
+  | | | |/ /   parent:      1:6db2ef61d156
+  | | | | |    parent:      3:27eef8ed80b4
+  | | | | |    user:        test
+  | | | | |    date:        Thu Jan 01 00:00:04 1970 +0000
+  | | | | |    summary:     (4) merge two known; one immediate left, one immediate right
+  | | | | |
+
+.. unless HGPLAINEXCEPT=graph is set:
+
+  $ HGPLAIN=1 HGPLAINEXCEPT=graph hg log -G -r 'file("a")' -m
+  @  changeset:   36:08a19a744424
+  :  branch:      branch
+  :  tag:         tip
+  :  parent:      35:9159c3644c5e
+  :  parent:      35:9159c3644c5e
+  :  user:        test
+  :  date:        Thu Jan 01 00:00:36 1970 +0000
+  :  summary:     (36) buggy merge: identical parents
+  :
+  o    changeset:   32:d06dffa21a31
+  |\   parent:      27:886ed638191b
+  | :  parent:      31:621d83e11f67
+  | :  user:        test
+  | :  date:        Thu Jan 01 00:00:32 1970 +0000
+  | :  summary:     (32) expand
+  | :
+  o :  changeset:   31:621d83e11f67
+  |\:  parent:      21:d42a756af44d
+  | :  parent:      30:6e11cd4b648f
+  | :  user:        test
+  | :  date:        Thu Jan 01 00:00:31 1970 +0000
+  | :  summary:     (31) expand
+  | :
+  o :    changeset:   30:6e11cd4b648f
+  |\ \   parent:      28:44ecd0b9ae99
+  | ~ :  parent:      29:cd9bb2be7593
+  |   :  user:        test
+  |   :  date:        Thu Jan 01 00:00:30 1970 +0000
+  |   :  summary:     (30) expand
+  |  /
+  o :    changeset:   28:44ecd0b9ae99
+  |\ \   parent:      1:6db2ef61d156
+  | ~ :  parent:      26:7f25b6c2f0b9
+  |   :  user:        test
+  |   :  date:        Thu Jan 01 00:00:28 1970 +0000
+  |   :  summary:     (28) merge zero known
+  |  /
+  o :    changeset:   26:7f25b6c2f0b9
+  |\ \   parent:      18:1aa84d96232a
+  | | :  parent:      25:91da8ed57247
+  | | :  user:        test
+  | | :  date:        Thu Jan 01 00:00:26 1970 +0000
+  | | :  summary:     (26) merge one known; far right
+  | | :
+  | o :  changeset:   25:91da8ed57247
+  | |\:  parent:      21:d42a756af44d
+  | | :  parent:      24:a9c19a3d96b7
+  | | :  user:        test
+  | | :  date:        Thu Jan 01 00:00:25 1970 +0000
+  | | :  summary:     (25) merge one known; far left
+  | | :
+  | o :    changeset:   24:a9c19a3d96b7
+  | |\ \   parent:      0:e6eb3150255d
+  | | ~ :  parent:      23:a01cddf0766d
+  | |   :  user:        test
+  | |   :  date:        Thu Jan 01 00:00:24 1970 +0000
+  | |   :  summary:     (24) merge one known; immediate right
+  | |  /
+  | o :    changeset:   23:a01cddf0766d
+  | |\ \   parent:      1:6db2ef61d156
+  | | ~ :  parent:      22:e0d9cccacb5d
+  | |   :  user:        test
+  | |   :  date:        Thu Jan 01 00:00:23 1970 +0000
+  | |   :  summary:     (23) merge one known; immediate left
+  | |  /
+  | o :  changeset:   22:e0d9cccacb5d
+  |/:/   parent:      18:1aa84d96232a
+  | :    parent:      21:d42a756af44d
+  | :    user:        test
+  | :    date:        Thu Jan 01 00:00:22 1970 +0000
+  | :    summary:     (22) merge two known; one far left, one far right
+  | :
+  | o    changeset:   21:d42a756af44d
+  | |\   parent:      19:31ddc2c1573b
+  | | |  parent:      20:d30ed6450e32
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:21 1970 +0000
+  | | |  summary:     (21) expand
+  | | |
+  +---o  changeset:   20:d30ed6450e32
+  | | |  parent:      0:e6eb3150255d
+  | | ~  parent:      18:1aa84d96232a
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:20 1970 +0000
+  | |    summary:     (20) merge two known; two far right
+  | |
+  | o    changeset:   19:31ddc2c1573b
+  | |\   parent:      15:1dda3f72782d
+  | | |  parent:      17:44765d7c06e0
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:19 1970 +0000
+  | | |  summary:     (19) expand
+  | | |
+  o | |  changeset:   18:1aa84d96232a
+  |\| |  parent:      1:6db2ef61d156
+  ~ | |  parent:      15:1dda3f72782d
+    | |  user:        test
+    | |  date:        Thu Jan 01 00:00:18 1970 +0000
+    | |  summary:     (18) merge two known; two far left
+   / /
+  | o    changeset:   17:44765d7c06e0
+  | |\   parent:      12:86b91144a6e9
+  | | |  parent:      16:3677d192927d
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:17 1970 +0000
+  | | |  summary:     (17) expand
+  | | |
+  | | o    changeset:   16:3677d192927d
+  | | |\   parent:      0:e6eb3150255d
+  | | ~ ~  parent:      1:6db2ef61d156
+  | |      user:        test
+  | |      date:        Thu Jan 01 00:00:16 1970 +0000
+  | |      summary:     (16) merge two known; one immediate right, one near right
+  | |
+  o |    changeset:   15:1dda3f72782d
+  |\ \   parent:      13:22d8966a97e3
+  | | |  parent:      14:8eac370358ef
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:15 1970 +0000
+  | | |  summary:     (15) expand
+  | | |
+  | o |  changeset:   14:8eac370358ef
+  | |\|  parent:      0:e6eb3150255d
+  | ~ |  parent:      12:86b91144a6e9
+  |   |  user:        test
+  |   |  date:        Thu Jan 01 00:00:14 1970 +0000
+  |   |  summary:     (14) merge two known; one immediate right, one far right
+  |  /
+  o |    changeset:   13:22d8966a97e3
+  |\ \   parent:      9:7010c0af0a35
+  | | |  parent:      11:832d76e6bdf2
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:13 1970 +0000
+  | | |  summary:     (13) expand
+  | | |
+  +---o  changeset:   12:86b91144a6e9
+  | | |  parent:      1:6db2ef61d156
+  | | ~  parent:      9:7010c0af0a35
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:12 1970 +0000
+  | |    summary:     (12) merge two known; one immediate right, one far left
+  | |
+  | o    changeset:   11:832d76e6bdf2
+  | |\   parent:      6:b105a072e251
+  | | |  parent:      10:74c64d036d72
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:11 1970 +0000
+  | | |  summary:     (11) expand
+  | | |
+  | | o  changeset:   10:74c64d036d72
+  | |/|  parent:      0:e6eb3150255d
+  | | ~  parent:      6:b105a072e251
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:10 1970 +0000
+  | |    summary:     (10) merge two known; one immediate left, one near right
+  | |
+  o |    changeset:   9:7010c0af0a35
+  |\ \   parent:      7:b632bb1b1224
+  | | |  parent:      8:7a0b11f71937
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:09 1970 +0000
+  | | |  summary:     (9) expand
+  | | |
+  | o |  changeset:   8:7a0b11f71937
+  |/| |  parent:      0:e6eb3150255d
+  | ~ |  parent:      7:b632bb1b1224
+  |   |  user:        test
+  |   |  date:        Thu Jan 01 00:00:08 1970 +0000
+  |   |  summary:     (8) merge two known; one immediate left, one far right
+  |  /
+  o |    changeset:   7:b632bb1b1224
+  |\ \   parent:      2:3d9a33b8d1e1
+  | ~ |  parent:      5:4409d547b708
+  |   |  user:        test
+  |   |  date:        Thu Jan 01 00:00:07 1970 +0000
+  |   |  summary:     (7) expand
+  |  /
+  | o  changeset:   6:b105a072e251
+  |/|  parent:      2:3d9a33b8d1e1
+  | ~  parent:      5:4409d547b708
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:06 1970 +0000
+  |    summary:     (6) merge two known; one immediate left, one far left
+  |
+  o    changeset:   5:4409d547b708
+  |\   parent:      3:27eef8ed80b4
+  | ~  parent:      4:26a8bac39d9f
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:05 1970 +0000
+  |    summary:     (5) expand
+  |
+  o    changeset:   4:26a8bac39d9f
+  |\   parent:      1:6db2ef61d156
+  ~ ~  parent:      3:27eef8ed80b4
+       user:        test
+       date:        Thu Jan 01 00:00:04 1970 +0000
+       summary:     (4) merge two known; one immediate left, one immediate right
+  
+
   $ cd ..
 
 Change graph shorten, test better with graphstyle.missing not none
@@ -2736,3 +3140,58 @@
   
   
   $ cd ..
+
+When inserting extra line nodes to handle more than 2 parents, ensure that
+the right node styles are used (issue5174):
+
+  $ hg init repo-issue5174
+  $ cd repo-issue5174
+  $ echo a > f0
+  $ hg ci -Aqm 0
+  $ echo a > f1
+  $ hg ci -Aqm 1
+  $ echo a > f2
+  $ hg ci -Aqm 2
+  $ hg co ".^"
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo a > f3
+  $ hg ci -Aqm 3
+  $ hg co ".^^"
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo a > f4
+  $ hg ci -Aqm 4
+  $ hg merge -r 2
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg ci -qm 5
+  $ hg merge -r 3
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg ci -qm 6
+  $ hg log -G -r '0 | 1 | 2 | 6'
+  @    changeset:   6:851fe89689ad
+  :\   tag:         tip
+  : :  parent:      5:4f1e3cf15f5d
+  : :  parent:      3:b74ba7084d2d
+  : :  user:        test
+  : :  date:        Thu Jan 01 00:00:00 1970 +0000
+  : :  summary:     6
+  : :
+  : \
+  : :\
+  : o :  changeset:   2:3e6599df4cce
+  : :/   user:        test
+  : :    date:        Thu Jan 01 00:00:00 1970 +0000
+  : :    summary:     2
+  : :
+  : o  changeset:   1:bd9a55143933
+  :/   user:        test
+  :    date:        Thu Jan 01 00:00:00 1970 +0000
+  :    summary:     1
+  :
+  o  changeset:   0:870a5edc339c
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     0
+  
+
--- a/tests/test-http-bundle1.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-http-bundle1.t	Tue May 03 10:41:17 2016 -0500
@@ -294,7 +294,7 @@
   "GET /?cmd=branchmap HTTP/1.1" 200 -
   "GET /?cmd=branchmap HTTP/1.1" 200 -
   "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks
-  "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+5eb5abfefeea63c80dd7553bcc3783f37e0c5524
+  "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+5eb5abfefeea63c80dd7553bcc3783f37e0c5524* (glob)
   "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases
 
   $ cd ..
--- a/tests/test-http.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-http.t	Tue May 03 10:41:17 2016 -0500
@@ -284,7 +284,7 @@
   "GET /?cmd=branchmap HTTP/1.1" 200 -
   "GET /?cmd=branchmap HTTP/1.1" 200 -
   "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks
-  "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=666f726365
+  "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=666f726365* (glob)
   "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases
 
   $ cd ..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-issue4074.t	Tue May 03 10:41:17 2016 -0500
@@ -0,0 +1,29 @@
+#require no-pure
+
+A script to generate nasty diff worst-case scenarios:
+
+  $ cat > s.py <<EOF
+  > import random
+  > for x in xrange(100000):
+  >     print
+  >     if random.randint(0, 100) >= 50:
+  >         x += 1
+  >     print hex(x)
+  > EOF
+
+  $ hg init a
+  $ cd a
+
+Check in a big file:
+
+  $ python ../s.py > a
+  $ hg ci -qAm0
+
+Modify it:
+
+  $ python ../s.py > a
+
+Time a check-in, should never take more than 10 seconds user time:
+
+  $ hg ci --time -m1
+  time: real .* secs .user [0-9][.].* sys .* (re)
--- a/tests/test-lock-badness.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-lock-badness.t	Tue May 03 10:41:17 2016 -0500
@@ -56,10 +56,12 @@
   > EOF
   $ echo b > b/b
   $ hg -R b ci -A -m b --config hooks.precommit="python:`pwd`/hooks.py:sleepone" > stdout &
-  $ hg -R b up -q --config hooks.pre-update="python:`pwd`/hooks.py:sleephalf"
+  $ hg -R b up -q --config hooks.pre-update="python:`pwd`/hooks.py:sleephalf" \
+  > > preup 2>&1
+  $ wait
+  $ cat preup
   waiting for lock on working directory of b held by '*:*' (glob)
-  got lock after ? seconds (glob)
-  $ wait
+  got lock after * seconds (glob)
   $ cat stdout
   adding b
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-mac-packages.t	Tue May 03 10:41:17 2016 -0500
@@ -0,0 +1,44 @@
+#require test-repo slow osx osxpackaging
+  $ OUTPUTDIR=`pwd`
+  $ export OUTPUTDIR
+  $ KEEPMPKG=yes
+  $ export KEEPMPKG
+
+  $ cd "$TESTDIR"/..
+  $ rm -rf dist
+  $ make osx > $OUTPUTDIR/build.log 2>&1
+  $ cd $OUTPUTDIR
+  $ ls -d *.pkg
+  Mercurial-*-macosx10.*.pkg (glob)
+
+  $ xar -xf Mercurial*.pkg
+
+Gather list of all installed files:
+  $ lsbom mercurial.pkg/Bom > boms.txt
+
+Spot-check some randomly selected files:
+  $ grep bdiff boms.txt | cut -d '	' -f 1,2,3
+  ./Library/Python/2.7/site-packages/mercurial/bdiff.so	100755	0/0
+  ./Library/Python/2.7/site-packages/mercurial/pure/bdiff.py	100644	0/0
+  ./Library/Python/2.7/site-packages/mercurial/pure/bdiff.pyc	100644	0/0
+  ./Library/Python/2.7/site-packages/mercurial/pure/bdiff.pyo	100644	0/0
+  $ egrep 'man[15]' boms.txt | cut -d '	' -f 1,2,3
+  ./usr/local/share/man/man1	40755	0/0
+  ./usr/local/share/man/man1/hg.1	100644	0/0
+  ./usr/local/share/man/man5	40755	0/0
+  ./usr/local/share/man/man5/hgignore.5	100644	0/0
+  ./usr/local/share/man/man5/hgrc.5	100644	0/0
+  $ grep bser boms.txt | cut -d '	' -f 1,2,3
+  ./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/bser.so	100755	0/0
+  ./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.py	100644	0/0
+  ./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.pyc	100644	0/0
+  ./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.pyo	100644	0/0
+  $ grep localrepo boms.txt | cut -d '	' -f 1,2,3
+  ./Library/Python/2.7/site-packages/mercurial/localrepo.py	100644	0/0
+  ./Library/Python/2.7/site-packages/mercurial/localrepo.pyc	100644	0/0
+  ./Library/Python/2.7/site-packages/mercurial/localrepo.pyo	100644	0/0
+  $ grep '/hg	' boms.txt | cut -d '	' -f 1,2,3
+  ./usr/local/bin/hg	100755	0/0
+
+Note that we're not currently installing any /etc/mercurial stuff,
+including merge-tool configurations.
--- a/tests/test-patchbomb.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-patchbomb.t	Tue May 03 10:41:17 2016 -0500
@@ -2874,7 +2874,7 @@
   $ echo "publicurl=$TESTTMP/t2" >> $HGRCPATH
   $ hg email --date '1980-1-1 0:1' -t foo -s test -r '10' | grep '^#'
   abort: public url $TESTTMP/t2 is missing 3b6f1ec9dde9
-  (use "hg push $TESTTMP/t2 -r 3b6f1ec9dde9")
+  (use 'hg push $TESTTMP/t2 -r 3b6f1ec9dde9')
   [1]
 
 public missing
@@ -2897,13 +2897,13 @@
   $ echo 'publicurl=$TESTTMP/t3' >> $HGRCPATH
   $ hg email --date '1980-1-1 0:1' -t foo -s test -r '10'
   abort: public url $TESTTMP/t3 is missing 3b6f1ec9dde9
-  (use "hg push $TESTTMP/t3 -r 3b6f1ec9dde9")
+  (use 'hg push $TESTTMP/t3 -r 3b6f1ec9dde9')
   [255]
 
 multiple heads are missing at public
 
   $ hg email --date '1980-1-1 0:1' -t foo -s test -r '2+10'
   abort: public "$TESTTMP/t3" is missing ff2c9fa2018b and 1 others
-  (use "hg push $TESTTMP/t3 -r ff2c9fa2018b -r 3b6f1ec9dde9")
+  (use 'hg push $TESTTMP/t3 -r ff2c9fa2018b -r 3b6f1ec9dde9')
   [255]
 
--- a/tests/test-rebase-pull.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-rebase-pull.t	Tue May 03 10:41:17 2016 -0500
@@ -311,3 +311,83 @@
   |
   o  0: 'C1'
   
+
+Multiple pre-existing heads on the branch
+-----------------------------------------
+
+Pull bring content, but nothing on the current branch, we should not consider
+pre-existing heads.
+
+  $ cd ../a
+  $ hg branch unrelatedbranch
+  marked working directory as branch unrelatedbranch
+  (branches are permanent and global, did you want a bookmark?)
+  $ echo B1 > B1
+  $ hg commit -Am B1
+  adding B1
+  $ cd ../c
+  $ hg up 'desc(L2)'
+  2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg pull --rebase
+  pulling from $TESTTMP/a (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  nothing to rebase
+
+There is two local heads and we pull a third one.
+The second local head should not confuse the `hg pull rebase`.
+
+  $ hg up 'desc(R6)'
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo M1 > M1
+  $ hg commit -Am M1
+  adding M1
+  $ cd ../a
+  $ hg up 'desc(R6)'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo R7 > R7
+  $ hg commit -Am R7
+  adding R7
+  $ cd ../c
+  $ hg up 'desc(L2)'
+  2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg pull --rebase
+  pulling from $TESTTMP/a (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  rebasing 7:864e0a2d2614 "L1"
+  rebasing 8:6dc0ea5dcf55 "L2"
+  saved backup bundle to $TESTTMP/c/.hg/strip-backup/864e0a2d2614-2f72c89c-backup.hg (glob)
+  $ hg tglog
+  @  12: 'L2'
+  |
+  o  11: 'L1'
+  |
+  o  10: 'R7'
+  |
+  | o  9: 'M1'
+  |/
+  | o  8: 'B1' unrelatedbranch
+  |/
+  o  7: 'R6'
+  |
+  o  6: 'R5'
+  |
+  o  5: 'R4'
+  |
+  o  4: 'R3'
+  |
+  o  3: 'R2'
+  |
+  o  2: 'R1'
+  |
+  o  1: 'C2'
+  |
+  o  0: 'C1'
+  
--- a/tests/test-revset.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-revset.t	Tue May 03 10:41:17 2016 -0500
@@ -952,6 +952,147 @@
   6
   2
 
+  $ cd ..
+
+test sorting by multiple keys including variable-length strings
+
+  $ hg init sorting
+  $ cd sorting
+  $ cat <<EOF >> .hg/hgrc
+  > [ui]
+  > logtemplate = '{rev} {branch|p5}{desc|p5}{author|p5}{date|hgdate}\n'
+  > [templatealias]
+  > p5(s) = pad(s, 5)
+  > EOF
+  $ hg branch -qf b12
+  $ hg ci -m m111 -u u112 -d '111 10800'
+  $ hg branch -qf b11
+  $ hg ci -m m12 -u u111 -d '112 7200'
+  $ hg branch -qf b111
+  $ hg ci -m m11 -u u12 -d '111 3600'
+  $ hg branch -qf b112
+  $ hg ci -m m111 -u u11 -d '120 0'
+  $ hg branch -qf b111
+  $ hg ci -m m112 -u u111 -d '110 14400'
+  created new head
+
+ compare revisions (has fast path):
+
+  $ hg log -r 'sort(all(), rev)'
+  0 b12  m111 u112 111 10800
+  1 b11  m12  u111 112 7200
+  2 b111 m11  u12  111 3600
+  3 b112 m111 u11  120 0
+  4 b111 m112 u111 110 14400
+
+  $ hg log -r 'sort(all(), -rev)'
+  4 b111 m112 u111 110 14400
+  3 b112 m111 u11  120 0
+  2 b111 m11  u12  111 3600
+  1 b11  m12  u111 112 7200
+  0 b12  m111 u112 111 10800
+
+ compare variable-length strings (issue5218):
+
+  $ hg log -r 'sort(all(), branch)'
+  1 b11  m12  u111 112 7200
+  2 b111 m11  u12  111 3600
+  4 b111 m112 u111 110 14400
+  3 b112 m111 u11  120 0
+  0 b12  m111 u112 111 10800
+
+  $ hg log -r 'sort(all(), -branch)'
+  0 b12  m111 u112 111 10800
+  3 b112 m111 u11  120 0
+  2 b111 m11  u12  111 3600
+  4 b111 m112 u111 110 14400
+  1 b11  m12  u111 112 7200
+
+  $ hg log -r 'sort(all(), desc)'
+  2 b111 m11  u12  111 3600
+  0 b12  m111 u112 111 10800
+  3 b112 m111 u11  120 0
+  4 b111 m112 u111 110 14400
+  1 b11  m12  u111 112 7200
+
+  $ hg log -r 'sort(all(), -desc)'
+  1 b11  m12  u111 112 7200
+  4 b111 m112 u111 110 14400
+  0 b12  m111 u112 111 10800
+  3 b112 m111 u11  120 0
+  2 b111 m11  u12  111 3600
+
+  $ hg log -r 'sort(all(), user)'
+  3 b112 m111 u11  120 0
+  1 b11  m12  u111 112 7200
+  4 b111 m112 u111 110 14400
+  0 b12  m111 u112 111 10800
+  2 b111 m11  u12  111 3600
+
+  $ hg log -r 'sort(all(), -user)'
+  2 b111 m11  u12  111 3600
+  0 b12  m111 u112 111 10800
+  1 b11  m12  u111 112 7200
+  4 b111 m112 u111 110 14400
+  3 b112 m111 u11  120 0
+
+ compare dates (tz offset should have no effect):
+
+  $ hg log -r 'sort(all(), date)'
+  4 b111 m112 u111 110 14400
+  0 b12  m111 u112 111 10800
+  2 b111 m11  u12  111 3600
+  1 b11  m12  u111 112 7200
+  3 b112 m111 u11  120 0
+
+  $ hg log -r 'sort(all(), -date)'
+  3 b112 m111 u11  120 0
+  1 b11  m12  u111 112 7200
+  0 b12  m111 u112 111 10800
+  2 b111 m11  u12  111 3600
+  4 b111 m112 u111 110 14400
+
+ be aware that 'sort(x, -k)' is not exactly the same as 'reverse(sort(x, k))'
+ because '-k' reverses the comparison, not the list itself:
+
+  $ hg log -r 'sort(0 + 2, date)'
+  0 b12  m111 u112 111 10800
+  2 b111 m11  u12  111 3600
+
+  $ hg log -r 'sort(0 + 2, -date)'
+  0 b12  m111 u112 111 10800
+  2 b111 m11  u12  111 3600
+
+  $ hg log -r 'reverse(sort(0 + 2, date))'
+  2 b111 m11  u12  111 3600
+  0 b12  m111 u112 111 10800
+
+ sort by multiple keys:
+
+  $ hg log -r 'sort(all(), "branch -rev")'
+  1 b11  m12  u111 112 7200
+  4 b111 m112 u111 110 14400
+  2 b111 m11  u12  111 3600
+  3 b112 m111 u11  120 0
+  0 b12  m111 u112 111 10800
+
+  $ hg log -r 'sort(all(), "-desc -date")'
+  1 b11  m12  u111 112 7200
+  4 b111 m112 u111 110 14400
+  3 b112 m111 u11  120 0
+  0 b12  m111 u112 111 10800
+  2 b111 m11  u12  111 3600
+
+  $ hg log -r 'sort(all(), "user -branch date rev")'
+  3 b112 m111 u11  120 0
+  4 b111 m112 u111 110 14400
+  1 b11  m12  u111 112 7200
+  0 b12  m111 u112 111 10800
+  2 b111 m11  u12  111 3600
+
+  $ cd ..
+  $ cd repo
+
 test subtracting something from an addset
 
   $ log '(outgoing() or removes(a)) - removes(a)'
--- a/tests/test-status.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-status.t	Tue May 03 10:41:17 2016 -0500
@@ -513,6 +513,18 @@
   M a
   R b
 
+using log status template (issue5155)
+  $ hg log -Tstatus -r 'wdir()' -C
+  changeset:   2147483647:ffffffffffff
+  parent:      0:8c55c58b4c0e
+  user:        test
+  date:        * (glob)
+  files:
+  M a
+    b
+  R b
+  
+
 Other "bug" highlight, the revision status does not report the copy information.
 This is buggy behavior.
 
@@ -521,4 +533,17 @@
   M a
   R b
 
+using log status template, the copy information is displayed correctly.
+  $ hg log -Tstatus -r. -C
+  changeset:   1:6685fde43d21
+  tag:         tip
+  user:        test
+  date:        * (glob)
+  summary:     blah
+  files:
+  M a
+    b
+  R b
+  
+
   $ cd ..
--- a/tests/test-subrepo-missing.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-subrepo-missing.t	Tue May 03 10:41:17 2016 -0500
@@ -121,4 +121,22 @@
   subrepo 'subrepo' is hidden in revision 674d05939c1e
   subrepo 'subrepo' not found in revision a7d05d9055a4
 
+verifying shouldn't init a new subrepo if the reference doesn't exist
+
+  $ mv subrepo b
+  $ hg verify
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  2 files, 5 changesets, 5 total revisions
+  checking subrepo links
+  0: repository $TESTTMP/repo/subrepo not found (glob)
+  1: repository $TESTTMP/repo/subrepo not found (glob)
+  3: repository $TESTTMP/repo/subrepo not found (glob)
+  4: repository $TESTTMP/repo/subrepo not found (glob)
+  $ ls
+  b
+  $ mv b subrepo
+
   $ cd ..
--- a/tests/test-tags.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-tags.t	Tue May 03 10:41:17 2016 -0500
@@ -262,12 +262,12 @@
   $ hg commit -m "head"
   created new head
 
-  $ hg tags
+  $ hg tags --debug
   .hgtags@75d9f02dfe28, line 2: cannot parse entry
   .hgtags@75d9f02dfe28, line 4: node 'foo' is not well formed
   .hgtags@c4be69a18c11, line 2: node 'x' is not well formed
-  tip                                8:c4be69a18c11
-  first                              0:acb14030fe0a
+  tip                                8:c4be69a18c11e8bc3a5fdbb576017c25f7d84663
+  first                              0:acb14030fe0a21b60322c440ad2d20cf7685a376
   $ hg tip
   changeset:   8:c4be69a18c11
   tag:         tip
--- a/tests/test-treediscovery.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-treediscovery.t	Tue May 03 10:41:17 2016 -0500
@@ -528,7 +528,7 @@
   "GET /?cmd=branchmap HTTP/1.1" 200 -
   "GET /?cmd=branchmap HTTP/1.1" 200 -
   "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks
-  "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+1827a5bb63e602382eb89dd58f2ac9f3b007ad91
+  "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+1827a5bb63e602382eb89dd58f2ac9f3b007ad91* (glob)
   "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases
   "GET /?cmd=capabilities HTTP/1.1" 200 -
   "GET /?cmd=heads HTTP/1.1" 200 -
--- a/tests/test-unbundlehash.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-unbundlehash.t	Tue May 03 10:41:17 2016 -0500
@@ -37,7 +37,7 @@
 The hash here is always the same since the remote repository only has the null head.
 
   $ cat access.log | grep unbundle
-  * - - [*] "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+6768033e216468247bd031a0a2d9876d79818f8f (glob)
+  * - - [*] "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+6768033e216468247bd031a0a2d9876d79818f8f* (glob)
 
 Explicitly kill daemons to let the test exit on Windows
 
--- a/tests/test-wireproto.t	Fri Apr 15 13:10:34 2016 -0700
+++ b/tests/test-wireproto.t	Tue May 03 10:41:17 2016 -0500
@@ -39,23 +39,23 @@
   $ cat error.log
   $ cat access.log
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:39 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:39 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:39* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:39* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:43 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:43 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:43* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:43* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:27 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:27 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:27* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:27* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:1033 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:1033 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:1033* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:1033* (glob)
 
 HTTP without args-in-POST:
   $ hg serve -R repo -p $HGPORT1 -d --pid-file=hg1.pid -E error.log -A access.log
@@ -76,23 +76,23 @@
   $ cat error.log
   $ cat access.log
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:39 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:39 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:39* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:39* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:43 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:43 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:43* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:43* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:27 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:27 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:27* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:27* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:17* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:1033 (glob)
-  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:1033 (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:1033* (glob)
+  * - - [*] "POST /?cmd=debugwireargs HTTP/1.1" 200 - x-hgargs-post:1033* (glob)
   * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
   * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=quatre&one=un&three=trois&two=deux (glob)
   * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=quatre&one=un&three=trois&two=deux (glob)