changeset 28324:549ff28a345f

merge with stable
author Matt Mackall <mpm@selenic.com>
date Wed, 02 Mar 2016 16:44:56 -0600
parents ffc693f87148 (current diff) 8949d73b2e1f (diff)
children 9fec3cb8d128
files mercurial/commands.py mercurial/hg.py tests/test-clone.t tests/test-strip.t
diffstat 9 files changed, 262 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsigs	Mon Dec 21 22:26:31 2015 -0800
+++ b/.hgsigs	Wed Mar 02 16:44:56 2016 -0600
@@ -121,3 +121,4 @@
 158bdc8965720ca4061f8f8d806563cfc7cdb62e 0 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
+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
--- a/.hgtags	Mon Dec 21 22:26:31 2015 -0800
+++ b/.hgtags	Wed Mar 02 16:44:56 2016 -0600
@@ -134,3 +134,4 @@
 158bdc8965720ca4061f8f8d806563cfc7cdb62e 3.7-rc
 2408645de650d8a29a6ce9e7dce601d8dd0d1474 3.7
 b698abf971e7377d9b7ec7fc8c52df45255b0329 3.7.1
+d493d64757eb45ada99fcb3693e479a51b7782da 3.7.2
--- a/hgext/strip.py	Mon Dec 21 22:26:31 2015 -0800
+++ b/hgext/strip.py	Wed Mar 02 16:44:56 2016 -0600
@@ -90,7 +90,7 @@
                                 "strip")),
           ('B', 'bookmark', [], _("remove revs only reachable from given"
                                   " bookmark"))],
-          _('hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...'))
+          _('hg strip [-k] [-f] [-B bookmark] [-r] REV...'))
 def stripcmd(ui, repo, *revs, **opts):
     """strip changesets and all their descendants from the repository
 
--- a/i18n/pt_BR.po	Mon Dec 21 22:26:31 2015 -0800
+++ b/i18n/pt_BR.po	Wed Mar 02 16:44:56 2016 -0600
@@ -5175,7 +5175,7 @@
 msgid "    - `edit` to edit this changeset"
 msgstr "    - `edit` para editar a revisão"
 
-msgid "    There are a number of ways to select the root changset:"
+msgid "    There are a number of ways to select the root changeset:"
 msgstr "    Há diversas maneiras de selecionar a revisão raiz:"
 
 msgid "    - Specify ANCESTOR directly"
@@ -18670,6 +18670,10 @@
 "    contendo quebras de linha misturadas são incluídos em cada\n"
 "    um dos estilos correspondentes."
 
+#. i18n: "eol" is a keyword
+msgid "eol requires a style name"
+msgstr "eol requer um nome de estilo"
+
 msgid ""
 "``copied()``\n"
 "    File that is recorded as being copied."
@@ -19569,8 +19573,8 @@
 "fará com que ``hg echo foo`` imprima ``foo`` em seu terminal.\n"
 "Um exemplo melhor (em um Unix) poderia ser::"
 
-msgid "   purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
-msgstr "   purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+msgid "   purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm"
+msgstr "   purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm"
 
 msgid ""
 "which will make ``hg purge`` delete all unknown files in the\n"
@@ -19694,12 +19698,12 @@
 "autenticação. Por exemplo::"
 
 msgid ""
-"    foo.prefix = hg.intevation.org/mercurial\n"
+"    foo.prefix = hg.intevation.de/mercurial\n"
 "    foo.username = foo\n"
 "    foo.password = bar\n"
 "    foo.schemes = http https"
 msgstr ""
-"    foo.prefix = hg.intevation.org/mercurial\n"
+"    foo.prefix = hg.intevation.de/mercurial\n"
 "    foo.username = foo\n"
 "    foo.password = bar\n"
 "    foo.schemes = http https"
@@ -21079,10 +21083,12 @@
 
 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"
+"    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"
 msgstr ""
 "    [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"
+"    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 ""
@@ -23447,7 +23453,7 @@
 "``backgroundclose``\n"
 "    Whether to enable closing file handles on background threads during certain\n"
 "    operations. Some platforms aren't very efficient at closing file\n"
-"    handles that have been written or appened to. By performing file closing\n"
+"    handles that have been written or appended to. By performing file closing\n"
 "    on background threads, file write rate can increase substantially.\n"
 "    (default: true on Windows, false elsewhere)"
 msgstr ""
@@ -27665,22 +27671,22 @@
 msgstr ".. functionsmarker"
 
 msgid ""
-"Also, for any expression that returns a list, there is a list operator:"
+"Also, for any expression that returns a list, there is a list operator::"
 msgstr ""
 "Além disso, para cada expressão que devolve uma lista, há um\n"
-"operador de lista:"
-
-msgid "- expr % \"{template}\""
-msgstr "- expr % \"{modelo}\""
-
-msgid ""
-"As seen in the above example, \"{template}\" is interpreted as a template.\n"
-"To prevent it from being interpreted, you can use an escape character \"\\{\"\n"
-"or a raw string prefix, \"r'...'\"."
-msgstr ""
-"Como visto no exemplo acima, \"{modelo}\" é interpretado como um modelo.\n"
+"operador de lista::"
+
+msgid "    expr % \"{template}\""
+msgstr "    expr % \"{modelo}\""
+
+msgid ""
+"As seen in the above example, ``{template}`` is interpreted as a template.\n"
+"To prevent it from being interpreted, you can use an escape character ``\\{``\n"
+"or a raw string prefix, ``r'...'``."
+msgstr ""
+"Como visto no exemplo acima, ``{modelo}`` é interpretado como um modelo.\n"
 "Para impedir que seja interpretado, você pode usar um caractere de\n"
-"escape \"\\{\" ou um prefixo de string literal \"r'...'\"."
+"escape ``\\{`` ou um prefixo de string literal ``r'...'``."
 
 msgid "Some sample command line templates:"
 msgstr "Alguns exemplos de modelos de linha de comando:"
@@ -32230,7 +32236,7 @@
 
 #, python-format
 msgid "reading manifest delta %s"
-msgstr "lendo alterações no manifesto %s"
+msgstr "lendo delta %s do manifesto"
 
 msgid "crosschecking files in changesets and manifests\n"
 msgstr "checagem cruzada de arquivos em revisões e no manifesto\n"
@@ -32321,6 +32327,121 @@
 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 = *\n"
+#~ "  dirty = True"
+#~ msgstr ""
+#~ "  [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"
 #~ "---------"
@@ -32368,6 +32489,25 @@
 #~ "   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"
+#~ msgstr ""
+#~ "    [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"
+
 #~ msgid ""
 #~ "# Edit history between %s and %s\n"
 #~ "#\n"
--- a/mercurial/commands.py	Mon Dec 21 22:26:31 2015 -0800
+++ b/mercurial/commands.py	Wed Mar 02 16:44:56 2016 -0600
@@ -1270,7 +1270,7 @@
       _('show only branches that have unmerged heads (DEPRECATED)')),
      ('c', 'closed', False, _('show normal and closed branches')),
     ] + formatteropts,
-    _('[-ac]'))
+    _('[-c]'))
 def branches(ui, repo, active=False, closed=False, **opts):
     """list repository named branches
 
@@ -5234,7 +5234,7 @@
     ('P', 'preview', None,
      _('review revisions to merge (no merge is performed)'))
      ] + mergetoolopts,
-    _('[-P] [-f] [[-r] REV]'))
+    _('[-P] [[-r] REV]'))
 def merge(ui, repo, node=None, **opts):
     """merge another revision into working directory
 
--- a/mercurial/hg.py	Mon Dec 21 22:26:31 2015 -0800
+++ b/mercurial/hg.py	Wed Mar 02 16:44:56 2016 -0600
@@ -343,17 +343,30 @@
                                "support clone by revision"))
         revs = [srcpeer.lookup(r) for r in rev]
 
+    # Obtain a lock before checking for or cloning the pooled repo otherwise
+    # 2 clients may race creating or populating it.
+    pooldir = os.path.dirname(sharepath)
+    # lock class requires the directory to exist.
+    try:
+        util.makedir(pooldir, False)
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            raise
+
+    poolvfs = scmutil.vfs(pooldir)
     basename = os.path.basename(sharepath)
 
-    if os.path.exists(sharepath):
-        ui.status(_('(sharing from existing pooled repository %s)\n') %
-                  basename)
-    else:
-        ui.status(_('(sharing from new pooled repository %s)\n') % basename)
-        # Always use pull mode because hardlinks in share mode don't work well.
-        # Never update because working copies aren't necessary in share mode.
-        clone(ui, peeropts, source, dest=sharepath, pull=True,
-              rev=rev, update=False, stream=stream)
+    with lock.lock(poolvfs, '%s.lock' % basename):
+        if os.path.exists(sharepath):
+            ui.status(_('(sharing from existing pooled repository %s)\n') %
+                      basename)
+        else:
+            ui.status(_('(sharing from new pooled repository %s)\n') % basename)
+            # Always use pull mode because hardlinks in share mode don't work
+            # well. Never update because working copies aren't necessary in
+            # share mode.
+            clone(ui, peeropts, source, dest=sharepath, pull=True,
+                  rev=rev, update=False, stream=stream)
 
     sharerepo = repository(ui, path=sharepath)
     share(ui, sharerepo, dest=dest, update=False, bookmarks=False)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/lockdelay.py	Wed Mar 02 16:44:56 2016 -0600
@@ -0,0 +1,26 @@
+# Dummy extension that adds a delay after acquiring a lock.
+#
+# This extension can be used to test race conditions between lock acquisition.
+
+from __future__ import absolute_import
+
+import os
+import time
+
+from mercurial import (
+    lock as lockmod,
+)
+
+class delaylock(lockmod.lock):
+    def lock(self):
+        delay = float(os.environ.get('HGPRELOCKDELAY', '0.0'))
+        if delay:
+            time.sleep(delay)
+        res = super(delaylock, self).lock()
+        delay = float(os.environ.get('HGPOSTLOCKDELAY', '0.0'))
+        if delay:
+            time.sleep(delay)
+        return res
+
+def extsetup(ui):
+    lockmod.lock = delaylock
--- a/tests/test-clone.t	Mon Dec 21 22:26:31 2015 -0800
+++ b/tests/test-clone.t	Wed Mar 02 16:44:56 2016 -0600
@@ -1036,3 +1036,49 @@
   $ hg --config share.pool=share -q clone -e "python \"$TESTDIR/dummyssh\"" a ssh://user@dummy/remote
   $ hg -R remote id -r 0
   acb14030fe0a
+
+Cloning into pooled storage doesn't race (issue5104)
+
+  $ HGPOSTLOCKDELAY=2.0 hg --config share.pool=racepool --config extensions.lockdelay=$TESTDIR/lockdelay.py clone source1a share-destrace1 > race1.log 2>&1 &
+  $ HGPRELOCKDELAY=1.0 hg --config share.pool=racepool --config extensions.lockdelay=$TESTDIR/lockdelay.py clone source1a share-destrace2  > race2.log 2>&1
+  $ wait
+
+  $ hg -R share-destrace1 log -r tip
+  changeset:   2:e5bfe23c0b47
+  bookmark:    bookA
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1a
+  
+
+  $ hg -R share-destrace2 log -r tip
+  changeset:   2:e5bfe23c0b47
+  bookmark:    bookA
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1a
+  
+  $ cat race1.log
+  (sharing from new pooled repository b5f04eac9d8f7a6a9fcb070243cccea7dc5ea0c1)
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 3 changesets with 3 changes to 1 files
+  updating working directory
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  searching for changes
+  no changes found
+  adding remote bookmark bookA
+
+  $ cat race2.log
+  (sharing from existing pooled repository b5f04eac9d8f7a6a9fcb070243cccea7dc5ea0c1)
+  updating working directory
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  waiting for lock on repository share-destrace2 held by * (glob)
+  got lock after \d+ seconds (re)
+  searching for changes
+  no changes found
+  adding remote bookmark bookA
--- a/tests/test-strip.t	Mon Dec 21 22:26:31 2015 -0800
+++ b/tests/test-strip.t	Wed Mar 02 16:44:56 2016 -0600
@@ -660,7 +660,7 @@
 
   $ hg strip -b tip
   hg strip: option -b not recognized
-  hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
+  hg strip [-k] [-f] [-B bookmark] [-r] REV...
   
   strip changesets and all their descendants from the repository