changeset 29937:2c302c654451

merge with stable
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Wed, 14 Sep 2016 17:12:39 +0200
parents 3e7ded768556 (current diff) e7766022a61a (diff)
children a059b17352ef
files mercurial/bundle2.py mercurial/context.py mercurial/crecord.py
diffstat 8 files changed, 231 insertions(+), 75 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsigs	Tue Sep 13 13:49:42 2016 -0700
+++ b/.hgsigs	Wed Sep 14 17:12:39 2016 +0200
@@ -131,3 +131,4 @@
 26a5d605b8683a292bb89aea11f37a81b06ac016 0 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
+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
--- a/.hgtags	Tue Sep 13 13:49:42 2016 -0700
+++ b/.hgtags	Wed Sep 14 17:12:39 2016 +0200
@@ -144,3 +144,4 @@
 26a5d605b8683a292bb89aea11f37a81b06ac016 3.8.4
 519bb4f9d3a47a6e83c2b414d58811ed38f503c2 3.9-rc
 299546f84e68dbb9bd026f0f3a974ce4bdb93686 3.9
+ccd436f7db6d5d7b9af89715179b911d031d44f1 3.9.1
--- a/i18n/pt_BR.po	Tue Sep 13 13:49:42 2016 -0700
+++ b/i18n/pt_BR.po	Wed Sep 14 17:12:39 2016 +0200
@@ -4117,18 +4117,6 @@
 "    diretório de trabalho serão comparados com seu pai."
 
 #, python-format
-msgid "use %(path)s to diff repository (or selected files)"
-msgstr "usa %(path)s para exibir diffs do repositório ou arquivos"
-
-#, python-format
-msgid ""
-"    Show differences between revisions for the specified files, using\n"
-"    the %(path)s program."
-msgstr ""
-"    Mostra diferenças entre revisões para os arquivos especificados,\n"
-"    usando o programa %(path)s."
-
-#, python-format
 msgid "hg %s [OPTION]... [FILE]..."
 msgstr "hg %s [OPÇÃO]... [ARQUIVO]..."
 
@@ -5616,6 +5604,14 @@
 "    bookmarks and the working copy; each line will then include the bookmark\n"
 "    name, or '.' for the working copy, as well."
 msgstr ""
+"    O journal é usado para ver as revisões anteriores para as quais\n"
+"    marcadores e a cópia de trabalho apontaram.\n"
+"    Por padrão, mostra as localizações anteriores da cópia de trabalho.\n"
+"    Ao receber um nome de marcador, mostra todas as posições anteriores\n"
+"    desse marcador.\n"
+"    Use a opção --all para mostrar localizações anteriores para todos\n"
+"    os marcadores e para a cópia de trabalho; cada linha incluirá o\n"
+"    nome do marcador, ou '.' para a cópia de trabalho."
 
 msgid ""
 "    If `name` starts with `re:`, the remainder of the name is treated as\n"
@@ -6425,8 +6421,8 @@
 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"
+msgid "unknown %s usercache location"
+msgstr "localização de cache de usuário %s desconhecida"
 
 #, python-format
 msgid "found %s in store\n"
@@ -14126,45 +14122,45 @@
 "são:"
 
 msgid ""
-"       rev          revision number\n"
-"       chainid      delta chain identifier (numbered by unique base)\n"
-"       chainlen     delta chain length to this revision\n"
-"       prevrev      previous revision in delta chain\n"
-"       deltatype    role of delta / how it was computed\n"
-"       compsize     compressed size of revision\n"
-"       uncompsize   uncompressed size of revision\n"
-"       chainsize    total size of compressed revisions in chain\n"
-"       chainratio   total chain size divided by uncompressed revision size\n"
+"    :``rev``:       revision number\n"
+"    :``chainid``:   delta chain identifier (numbered by unique base)\n"
+"    :``chainlen``:  delta chain length to this revision\n"
+"    :``prevrev``:   previous revision in delta chain\n"
+"    :``deltatype``: role of delta / how it was computed\n"
+"    :``compsize``:  compressed size of revision\n"
+"    :``uncompsize``: uncompressed size of revision\n"
+"    :``chainsize``: total size of compressed revisions in chain\n"
+"    :``chainratio``: total chain size divided by uncompressed revision size\n"
 "                    (new delta chains typically start at ratio 2.00)\n"
-"       lindist      linear distance from base revision in delta chain to end\n"
+"    :``lindist``:   linear distance from base revision in delta chain to end\n"
 "                    of this revision\n"
-"       extradist    total size of revisions not part of this delta chain from\n"
+"    :``extradist``: total size of revisions not part of this delta chain from\n"
 "                    base of delta chain to end of this revision; a measurement\n"
 "                    of how much extra data we need to read/seek across to read\n"
 "                    the delta chain for this revision\n"
-"       extraratio   extradist divided by chainsize; another representation of\n"
+"    :``extraratio``: extradist divided by chainsize; another representation of\n"
 "                    how much unrelated data is needed to load this delta chain\n"
 "    "
 msgstr ""
-"       rev          número da revisão\n"
-"       chainid      identificador de cadeia de deltas (numerado por base única)\n"
-"       chainlen     comprimento da cadeia de deltas para esta revisão\n"
-"       prevrev      revisão anterior na cadeia de deltas\n"
-"       deltatype    tipo de delta / como foi computado\n"
-"       compsize     tamanho comprimido da revisão\n"
-"       uncompsize   tamanho não comprimido da revisão\n"
-"       chainsize    tamanho total das revisões comprimidas na cadeia\n"
-"       chainratio   tamanho total da cadeia dividido pelo tamanho não\n"
+"    :``rev``:       número da revisão\n"
+"    :``chainid``:   identificador de cadeia de deltas (numerado por base única)\n"
+"    :``chainlen``:  comprimento da cadeia de deltas para esta revisão\n"
+"    :``prevrev``:   revisão anterior na cadeia de deltas\n"
+"    :``deltatype``: tipo de delta / como foi computado\n"
+"    :``compsize``:  tamanho comprimido da revisão\n"
+"    :``uncompsize``: tamanho não comprimido da revisão\n"
+"    :``chainsize``: tamanho total das revisões comprimidas na cadeia\n"
+"    :``chainratio``: tamanho total da cadeia dividido pelo tamanho não\n"
 "                    comprimido da revisão\n"
 "                    (novas cadeias de deltas tipicamente começam em 2.00)\n"
-"       lindist      distância linear da revisão base na cadeia de deltas\n"
+"    :``lindist``:   distância linear da revisão base na cadeia de deltas\n"
 "                    até o final desta revisão\n"
-"       extradist    tamanho total de revisões que não fazem parte desta\n"
+"    :``extradist``: tamanho total de revisões que não fazem parte desta\n"
 "                    cadeia de deltas da base da cadeia de deltas até o\n"
 "                    fim desta revisão; uma medida de quantos dados\n"
 "                    extras em leitura ou posicionamento são necessários\n"
 "                    para ler a cadeia de deltas para esta revisão\n"
-"       extraratio   extradist dividido por chainsize; outra representação\n"
+"    :``extraratio``: extradist dividido por chainsize; outra representação\n"
 "                    de quantos dados não relacionados são necessários para\n"
 "                    carregar esta cadeia de deltas\n"
 "    "
@@ -15621,7 +15617,7 @@
 "    resulting changeset has a different ID than the one recorded in\n"
 "    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."
+"    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"
@@ -15630,7 +15626,7 @@
 "    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."
+"    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"
@@ -21922,7 +21918,7 @@
 "    Esta opção não tem efeito se a opção ``fingerprints`` estiver\n"
 "    definida para o servidor."
 
-msgid "    The format of the file is as follows:"
+msgid "    The format of the file is as follows::"
 msgstr "    O formato do arquivo é como segue::"
 
 msgid ""
@@ -23119,6 +23115,20 @@
 "mais detalhes."
 
 msgid ""
+"``templates``\n"
+"-------------"
+msgstr ""
+"``templates``\n"
+"-------------"
+
+msgid ""
+"Use the ``[templates]`` section to define template strings.\n"
+"See :hg:`help templates` for details."
+msgstr ""
+"Use a seção ``[templates]`` para definir strings de modelos.\n"
+"Veja :hg:`help templates` para detalhes."
+
+msgid ""
 "``trusted``\n"
 "-----------"
 msgstr ""
@@ -23401,12 +23411,12 @@
 
 msgid ""
 "``interface.chunkselector``\n"
-"    Select the interface for change recording (e.g. :hg:`commit` -i).\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"
+"    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."
@@ -27927,14 +27937,14 @@
 ":hg:`serve` can also start a \"command server.\" Clients can connect\n"
 "to this server and issue Mercurial commands over a special protocol.\n"
 "For more details on the command server, including links to client\n"
-"libraries, see https://mercurial.selenic.com/wiki/CommandServer."
+"libraries, see https://www.mercurial-scm.org/wiki/CommandServer."
 msgstr ""
 ":hg:`serve` também pode iniciar um \"servidor de comandos.\"\n"
 "Clientes podem conectar a esse servidor e enviar comandos\n"
 "do Mercurial através de um protocolo especial.\n"
 "Para mais detalhes sobre o servidor de comandos, incluindo\n"
 "referências para bibliotecas de clientes, veja\n"
-"https://mercurial.selenic.com/wiki/CommandServer."
+"https://www.mercurial-scm.org/wiki/CommandServer."
 
 msgid ""
 ":hg:`serve` based interfaces (the hgweb and command servers) have the\n"
@@ -28804,6 +28814,27 @@
 "define dois apelidos de símbolos, ``r`` e ``rn``, e um apelido de função\n"
 "``leftpad()``."
 
+msgid ""
+"It's also possible to specify complete template strings, using the\n"
+"``templates`` section. The syntax used is the general template string syntax."
+msgstr ""
+"Também é possível especificar strings de modelo completas, usando\n"
+"a seção ``templates``. A sintaxe usada é a mesma sintaxe geral de\n"
+"strings de modelo."
+
+msgid ""
+"  [templates]\n"
+"  nodedate = \"{node|short}: {date(date, \"%Y-%m-%d\")}\\n\""
+msgstr ""
+"  [templates]\n"
+"  nodedate = \"{node|short}: {date(date, \"%Y-%m-%d\")}\\n\""
+
+msgid "defines a template, ``nodedate``, which can be called like::"
+msgstr "define um modelo, ``nodedate``, que pode ser chamado assim::"
+
+msgid "  $ hg log -r . -Tnodedate"
+msgstr "  $ hg log -r . -Tnodedate"
+
 msgid "Some sample command line templates:"
 msgstr "Alguns exemplos de modelos de linha de comando:"
 
@@ -29191,10 +29222,6 @@
 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"
 
@@ -31668,9 +31695,11 @@
 msgid "unknown sort key %r"
 msgstr "especificação de ordenação desconhecida: %r"
 
+#. i18n: "topo" is a keyword
 msgid "topo sort order cannot be combined with other sort keys"
 msgstr "a ordem topo não pode ser combinada com outras formas de ordenação"
 
+#. i18n: "topo" and "topo.firstbranch" are keywords
 msgid "topo.firstbranch can only be used when using the topo sort key"
 msgstr "topo.firstbranch só pode ser usada com a chave de ordenação topo"
 
@@ -32032,14 +32061,56 @@
 "carregado; veja https://mercurial-scm.org/wiki/SecureConnections para como "
 "configurar o Mercurial para evitar este erro)\n"
 
-msgid ""
-"(could not negotiate a common protocol; see https://mercurial-"
-"scm.org/wiki/SecureConnections for how to configure Mercurial to avoid this "
-"error)\n"
-msgstr ""
-"(não foi possível negociar um protocolo em comum; veja https://mercurial-"
-"scm.org/wiki/SecureConnections para como configurar o Mercurial para evitar "
-"este erro)\n"
+#, python-format
+msgid ""
+"(could not communicate with %s using security protocols %s; if you are using"
+" a modern Mercurial version, consider contacting the operator of this "
+"server; see https://mercurial-scm.org/wiki/SecureConnections for more "
+"info)\n"
+msgstr ""
+"(não foi possível comunicar com %s usando os protocolos de segurança %s; se "
+"você estiver usando uma versão moderna do Mercurial, considere contactar o "
+"operador deste servidor; veja https://mercurial-"
+"scm.org/wiki/SecureConnections para mais informações)\n"
+
+#, python-format
+msgid ""
+"(could not communicate with %s using TLS 1.0; the likely cause of this is "
+"the server no longer supports TLS 1.0 because it has known security "
+"vulnerabilities; see https://mercurial-scm.org/wiki/SecureConnections for "
+"more info)\n"
+msgstr ""
+"(não foi possível comunicar com %s usando TLS 1.0; a causa mais provável "
+"deste problema é o servidor não suportar mais TLS 1.0 por essa versão "
+"apresentar vulnerabilidades de segurança conhecidas; veja https://mercurial-"
+"scm.org/wiki/SecureConnections para mais informações)\n"
+
+#, python-format
+msgid ""
+"(could not negotiate a common security protocol (%s+) with %s; the likely "
+"cause is Mercurial is configured to be more secure than the server can "
+"support)\n"
+msgstr ""
+"(não foi possível negociar um protocolo de segurança comum (%s+) com %s; a "
+"causa mais provável deste problema é o Mercurial estar configurado para ser "
+"mais seguro do que o servidor suporta)\n"
+
+#, python-format
+msgid ""
+"(consider contacting the operator of this server and ask them to support "
+"modern TLS protocol versions; or, set hostsecurity.%s:minimumprotocol=tls1.0"
+" to allow use of legacy, less secure protocols when communicating with this "
+"server)\n"
+msgstr ""
+"(considere entrar em contato com o operador deste servidor e solicitar que "
+"suporte versões modernas de protocolo TLS; ou defina "
+"hostsecurity.%s:minimumprotocol=tls1.0 para permitir o uso de protocolos "
+"legados menos seguros ao comunicar com este servidor)\n"
+
+msgid "(see https://mercurial-scm.org/wiki/SecureConnections for more info)\n"
+msgstr ""
+"(veja https://mercurial-scm.org/wiki/SecureConnections para mais "
+"informações)\n"
 
 msgid "ssl connection failed"
 msgstr "a conexão ssl falhou"
@@ -33765,6 +33836,28 @@
 msgid "number of cpus must be an integer"
 msgstr "o número de cpus deve ser um inteiro"
 
+#~ msgid "use %(path)s to diff repository (or selected files)"
+#~ msgstr "usa %(path)s para exibir diffs do repositório ou arquivos"
+
+#~ msgid ""
+#~ "    Show differences between revisions for the specified files, using\n"
+#~ "    the %(path)s program."
+#~ msgstr ""
+#~ "    Mostra diferenças entre revisões para os arquivos especificados,\n"
+#~ "    usando o programa %(path)s."
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
+
+#~ msgid ""
+#~ "(could not negotiate a common protocol; see https://mercurial-"
+#~ "scm.org/wiki/SecureConnections for how to configure Mercurial to avoid this "
+#~ "error)\n"
+#~ msgstr ""
+#~ "(não foi possível negociar um protocolo em comum; veja https://mercurial-"
+#~ "scm.org/wiki/SecureConnections para como configurar o Mercurial para evitar "
+#~ "este erro)\n"
+
 #~ msgid "hooks for integrating with the CIA.vc notification service"
 #~ msgstr "ganchos para integração com o serviço de notificação CIA.vc"
 
--- a/mercurial/bundle2.py	Tue Sep 13 13:49:42 2016 -0700
+++ b/mercurial/bundle2.py	Wed Sep 14 17:12:39 2016 +0200
@@ -353,7 +353,7 @@
     try:
         for nbpart, part in iterparts:
             _processpart(op, part)
-    except BaseException as exc:
+    except Exception as exc:
         for nbpart, part in iterparts:
             # consume the bundle content
             part.seek(0, 2)
@@ -382,6 +382,7 @@
     The part is guaranteed to have been fully consumed when the function exits
     (even if an exception is raised)."""
     status = 'unknown' # used by debug output
+    hardabort = False
     try:
         try:
             handler = parthandlermapping.get(part.type)
@@ -436,9 +437,15 @@
                 outpart = op.reply.newpart('output', data=output,
                                            mandatory=False)
                 outpart.addparam('in-reply-to', str(part.id), mandatory=False)
+    # If exiting or interrupted, do not attempt to seek the stream in the
+    # finally block below. This makes abort faster.
+    except (SystemExit, KeyboardInterrupt):
+        hardabort = True
+        raise
     finally:
         # consume the part content to not corrupt the stream.
-        part.seek(0, 2)
+        if not hardabort:
+            part.seek(0, 2)
 
 
 def decodecaps(blob):
@@ -1467,7 +1474,7 @@
 def handleoutput(op, inpart):
     """forward output captured on the server to the client"""
     for line in inpart.read().splitlines():
-        op.ui.status(('remote: %s\n' % line))
+        op.ui.status(_('remote: %s\n') % line)
 
 @parthandler('replycaps')
 def handlereplycaps(op, inpart):
--- a/mercurial/context.py	Tue Sep 13 13:49:42 2016 -0700
+++ b/mercurial/context.py	Wed Sep 14 17:12:39 2016 +0200
@@ -990,15 +990,29 @@
         # bit recursion-hostile. Instead we do an iterative
         # depth-first search.
 
+        # 1st DFS pre-calculates pcache and needed
         visit = [base]
-        hist = {}
         pcache = {}
         needed = {base: 1}
         while visit:
+            f = visit.pop()
+            if f in pcache:
+                continue
+            pl = parents(f)
+            pcache[f] = pl
+            for p in pl:
+                needed[p] = needed.get(p, 0) + 1
+                if p not in pcache:
+                    visit.append(p)
+
+        # 2nd DFS does the actual annotate
+        visit[:] = [base]
+        hist = {}
+        while visit:
             f = visit[-1]
-            pcached = f in pcache
-            if not pcached:
-                pcache[f] = parents(f)
+            if f in hist:
+                visit.pop()
+                continue
 
             ready = True
             pl = pcache[f]
@@ -1006,18 +1020,11 @@
                 if p not in hist:
                     ready = False
                     visit.append(p)
-                if not pcached:
-                    needed[p] = needed.get(p, 0) + 1
             if ready:
                 visit.pop()
-                reusable = f in hist
-                if reusable:
-                    curr = hist[f]
-                else:
-                    curr = decorate(f.data(), f)
+                curr = decorate(f.data(), f)
                 for p in pl:
-                    if not reusable:
-                        curr = pair(hist[p], curr)
+                    curr = pair(hist[p], curr)
                     if needed[p] == 1:
                         del hist[p]
                         del needed[p]
@@ -1025,7 +1032,7 @@
                         needed[p] -= 1
 
                 hist[f] = curr
-                pcache[f] = []
+                del pcache[f]
 
         return zip(hist[base][0], hist[base][1].splitlines(True))
 
--- a/mercurial/crecord.py	Tue Sep 13 13:49:42 2016 -0700
+++ b/mercurial/crecord.py	Wed Sep 14 17:12:39 2016 +0200
@@ -387,7 +387,7 @@
 
         contextlen = (len(self.before) + len(self.after) +
                       removedconvertedtocontext)
-        if self.after and self.after[-1] == '\\ no newline at end of file\n':
+        if self.after and self.after[-1] == '\\ No newline at end of file\n':
             contextlen -= 1
         fromlen = contextlen + self.removed
         tolen = contextlen + self.added
--- a/tests/test-annotate.t	Tue Sep 13 13:49:42 2016 -0700
+++ b/tests/test-annotate.t	Wed Sep 14 17:12:39 2016 +0200
@@ -606,3 +606,35 @@
   3: B
 
   $ cd ..
+
+Issue5360: Deleted chunk in p1 of a merge changeset
+
+  $ hg init repo-5360
+  $ cd repo-5360
+  $ echo 1 > a
+  $ hg commit -A a -m 1
+  $ echo 2 >> a
+  $ hg commit -m 2
+  $ echo a > a
+  $ hg commit -m a
+  $ hg update '.^' -q
+  $ echo 3 >> a
+  $ hg commit -m 3 -q
+  $ hg merge 2 -q
+  $ cat > a << EOF
+  > b
+  > 1
+  > 2
+  > 3
+  > a
+  > EOF
+  $ hg resolve --mark -q
+  $ hg commit -m m
+  $ hg annotate a
+  4: b
+  0: 1
+  1: 2
+  3: 3
+  2: a
+
+  $ cd ..
--- a/tests/test-commit-interactive-curses.t	Tue Sep 13 13:49:42 2016 -0700
+++ b/tests/test-commit-interactive-curses.t	Wed Sep 14 17:12:39 2016 +0200
@@ -9,6 +9,21 @@
   > crecordtest = testModeCommands
   > EOF
 
+Record with noeol at eof (issue5268)
+  $ hg init noeol
+  $ cd noeol
+  $ printf '0' > a
+  $ printf '0\n' > b
+  $ hg ci -Aqm initial
+  $ printf '1\n0' > a
+  $ printf '1\n0\n' > b
+  $ cat <<EOF >testModeCommands
+  > c
+  > EOF
+  $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit  -i -m "add hunks" -d "0 0"
+  $ cd ..
+
+Normal repo
   $ hg init a
   $ cd a