merge with stable
authorMatt Mackall <mpm@selenic.com>
Tue, 19 Nov 2013 11:29:56 -0500
changeset 20072 6d4fda48b4e3
parent 20065 08fffc33af47 (current diff)
parent 20071 4778f398ec83 (diff)
child 20073 eeba4eaf0716
merge with stable
mercurial/cmdutil.py
tests/test-command-template.t
--- a/hgext/color.py	Sun Nov 17 20:22:59 2013 -0500
+++ b/hgext/color.py	Tue Nov 19 11:29:56 2013 -0500
@@ -386,9 +386,7 @@
         # i18n: "label" is a keyword
         raise error.ParseError(_("label expects two arguments"))
 
-    thing = templater.stringify(args[1][0](context, mapping, args[1][1]))
-    thing = templater.runtemplate(context, mapping,
-                                  templater.compiletemplate(thing, context))
+    thing = templater._evalifliteral(args[1], context, mapping)
 
     # apparently, repo could be a string that is the favicon?
     repo = mapping.get('repo', '')
--- a/hgext/histedit.py	Sun Nov 17 20:22:59 2013 -0500
+++ b/hgext/histedit.py	Tue Nov 19 11:29:56 2013 -0500
@@ -159,6 +159,7 @@
 from mercurial import util
 from mercurial import obsolete
 from mercurial import merge as mergemod
+from mercurial.lock import release
 from mercurial.i18n import _
 
 cmdtable = {}
@@ -476,6 +477,15 @@
     for intentional "edit" command, but also for resolving unexpected
     conflicts).
     """
+    lock = wlock = None
+    try:
+        wlock = repo.wlock()
+        lock = repo.lock()
+        _histedit(ui, repo, *freeargs, **opts)
+    finally:
+        release(lock, wlock)
+
+def _histedit(ui, repo, *freeargs, **opts):
     # TODO only abort if we try and histedit mq patches, not just
     # blanket if mq patches are applied somewhere
     mq = getattr(repo, 'mq', None)
--- a/i18n/pt_BR.po	Sun Nov 17 20:22:59 2013 -0500
+++ b/i18n/pt_BR.po	Tue Nov 19 11:29:56 2013 -0500
@@ -3010,12 +3010,13 @@
 "  [repository]\n"
 "  native = LF"
 
-msgid ""
-".. note::\n"
+msgid ".. note::"
+msgstr ".. note::"
+
+msgid ""
 "   The rules will first apply when files are touched in the working\n"
 "   copy, e.g. by updating to null and back to tip to touch all files."
 msgstr ""
-".. note::\n"
 "   As regras passarão a ser aplicadas a partir do momento em que os\n"
 "   arquivos forem mexidos na cópia de trabalho, por exemplo após um\n"
 "   update para null e de volta para a revisão atual para mexer em\n"
@@ -4709,11 +4710,9 @@
 "    svn = True"
 
 msgid ""
-".. note::\n"
 "   The more specific you are in your filename patterns the less you\n"
 "   lose speed in huge repositories."
 msgstr ""
-".. note::\n"
 "   Quanto mais específico você for em seus padrões de arquivo,\n"
 "   menos velocidade será perdida em repositórios muito grandes."
 
@@ -6749,12 +6748,11 @@
 "    Sem argumentos, imprime as guardas ativas no momento.\n"
 "    Com um argumento, define guardas para o patch pedido."
 
-msgid ""
-"    .. note::\n"
-"       Specifying negative guards now requires '--'."
-msgstr ""
-"    .. note::\n"
-"       A especificação de guardas negativas agora exige '--'."
+msgid "    .. note::"
+msgstr "    .. note::"
+
+msgid "       Specifying negative guards now requires '--'."
+msgstr "       A especificação de guardas negativas agora exige '--'."
 
 msgid "    To set guards on another patch::"
 msgstr "    Para definir guardas em um outro patch::"
@@ -7342,7 +7340,7 @@
 "Notifications will not be sent until the ``notify.test`` value is set\n"
 "to ``False``; see below."
 msgstr ""
-"Notificações mas não serão enviadas até que você defina a entrada\n"
+"Notificações não serão enviadas até que você defina a entrada\n"
 "``notify.test`` como ``False``; veja abaixo."
 
 msgid ""
@@ -7433,7 +7431,7 @@
 "notify.outgoing\n"
 "  Template to use when run as an outgoing hook, overriding ``notify.template``."
 msgstr ""
-"notify.incoming\n"
+"notify.outgoing\n"
 "  O modelo usado ao executar o gancho outgoing; sobrepõe\n"
 "  ``notify.template``."
 
@@ -8946,7 +8944,6 @@
 "    compartilha seu histórico com outro repositório."
 
 msgid ""
-"    .. note::\n"
 "       using rollback or extensions that destroy/modify history (mq,\n"
 "       rebase, etc.) can cause considerable confusion with shared\n"
 "       clones. In particular, if two shared clones are both updated to\n"
@@ -8957,7 +8954,6 @@
 "       the broken clone to reset it to a changeset that still exists.\n"
 "    "
 msgstr ""
-"    .. note::\n"
 "       o uso de rollback ou extensões que destroem ou modificam\n"
 "       o histórico (mq, rebase, etc) pode causar confusão considerável\n"
 "       com clones compartilhados. Em particular, se dois clones\n"
@@ -10790,11 +10786,9 @@
 "    manualmente."
 
 msgid ""
-"    .. note::\n"
 "      backout cannot be used to fix either an unwanted or\n"
 "      incorrect merge."
 msgstr ""
-"    .. note::\n"
 "      backout não pode ser usado para corrigir uma mesclagem\n"
 "      incorreta ou indesejada."
 
@@ -11230,12 +11224,10 @@
 msgstr "define ou mostra o nome de ramo atual"
 
 msgid ""
-"    .. note::\n"
 "       Branch names are permanent and global. Use :hg:`bookmark` to create a\n"
 "       light-weight bookmark instead. See :hg:`help glossary` for more\n"
 "       information about named branches and bookmarks."
 msgstr ""
-"    .. note::\n"
 "       Nomes de ramos são permanentes e globais. Use :hg:`bookmark`\n"
 "       para criar um marcador leve temporário. Veja :hg:`help glossary`\n"
 "       para mais informações sobre ramos nomeados e marcadores."
@@ -12461,12 +12453,10 @@
 "    \"unified diff\"."
 
 msgid ""
-"    .. note::\n"
 "       diff may generate unexpected results for merges, as it will\n"
 "       default to comparing against the working directory's first\n"
 "       parent changeset if no revisions are specified."
 msgstr ""
-"    .. note::\n"
 "       diff pode gerar resultados inesperados para mesclagens, já\n"
 "       que por padrão irá comparar com o primeiro pai do diretório de\n"
 "       trabalho se uma revisão não for especificada."
@@ -12569,12 +12559,10 @@
 "    e comentário de consolidação."
 
 msgid ""
-"    .. note::\n"
 "       export may generate unexpected diff output for merge\n"
 "       changesets, as it will compare the merge changeset against its\n"
 "       first parent only."
 msgstr ""
-"    .. note::\n"
 "       export pode gerar saída de diff inesperada para revisões\n"
 "       de mesclagem, já que irá comparar a revisão de mesclagem\n"
 "       apenas com seu primeiro pai."
@@ -12761,12 +12749,8 @@
 "    resolvidos, o processo de enxerto pode ser retomado usando a\n"
 "    opção -c/--continue."
 
-msgid ""
-"    .. note::\n"
-"      The -c/--continue option does not reapply earlier options."
-msgstr ""
-"    .. note::\n"
-"      A opção -c/--continue não reaplica opções anteriores."
+msgid "      The -c/--continue option does not reapply earlier options."
+msgstr "      A opção -c/--continue não reaplica opções anteriores."
 
 msgid ""
 "      - copy a single change to the stable branch and edit its description::"
@@ -13453,26 +13437,22 @@
 "    mensagem de consolidação completa."
 
 msgid ""
-"    .. note::\n"
 "       log -p/--patch may generate unexpected diff output for merge\n"
 "       changesets, as it will only compare the merge changeset against\n"
 "       its first parent. Also, only files different from BOTH parents\n"
 "       will appear in files:."
 msgstr ""
-"    .. note::\n"
 "       log -p/--patch pode gerar saídas de diff inesperadas para\n"
 "       mesclagens, pois irá comparar a revisão de mesclagem apenas\n"
 "       com seu primeiro pai. Além disso, apenas arquivos diferentes\n"
 "       de AMBOS os pais aparecerão na lista de arquivos."
 
 msgid ""
-"    .. note::\n"
 "       for performance reasons, log FILE may omit duplicate changes\n"
 "       made on branches and will not show deletions. To see all\n"
 "       changes including duplicates and deletions, use the --removed\n"
 "       switch."
 msgstr ""
-"    .. note::\n"
 "       por razões de desempenho, log ARQUIVO pode omitir mudanças\n"
 "       duplicadas feitas em outros ramos, e não mostra remoções.\n"
 "       Para ver todas as mudanças incluindo duplicatas e remoções,\n"
@@ -14033,12 +14013,10 @@
 "    forçar outras mudanças."
 
 msgid ""
-"    .. note::\n"
 "      Extra care should be taken with the -f/--force option,\n"
 "      which will push all new heads on all branches, an action which will\n"
 "      almost always cause confusion for collaborators."
 msgstr ""
-"    .. note::\n"
 "      Cuidado extra deve ser tomado ao usar a opção -f/--force,\n"
 "      que enviará todas as novas cabeças em todos os ramos, o que\n"
 "      quase sempre confunde os outros colaboradores."
@@ -14363,12 +14341,10 @@
 "restaura arquivos para o estado correspondente a uma cópia de trabalho"
 
 msgid ""
-"    .. note::\n"
 "       To check out earlier revisions, you should use :hg:`update REV`.\n"
 "       To cancel an uncommitted merge (and lose your changes),\n"
 "       use :hg:`update --clean .`."
 msgstr ""
-"    .. note::\n"
 "       Para obter revisões anteriores, você deve usar :hg:`update REV`.\n"
 "       Para cancelar uma mesclagem não consolidada (e descartar suas\n"
 "       modificações), use :hg:`update --clean .`."
@@ -14735,13 +14711,11 @@
 "    com -u/--unknown (desconhecidos) ou -i/--ignored (ignorados)."
 
 msgid ""
-"    .. note::\n"
 "       status may appear to disagree with diff if permissions have\n"
 "       changed or a merge has occurred. The standard diff format does\n"
 "       not report permission changes and diff only reports changes\n"
 "       relative to one merge parent."
 msgstr ""
-"    .. note::\n"
 "       o comando status pode aparentemente discordar do comando\n"
 "       diff se ocorrer uma mudança de permissões ou uma mesclagem. O\n"
 "       formato diff padrão não informa mudanças de permissão e o\n"
@@ -23586,15 +23560,6 @@
 msgid "cannot start server at '%s:%d': %s"
 msgstr "não é possível iniciar o servidor em '%s:%d': %s"
 
-msgid "exact revision search"
-msgstr "busca exata por revisões"
-
-msgid "literal keyword search"
-msgstr "busca por palavra chave literal"
-
-msgid "revset expression search"
-msgstr "busca por expressão revset"
-
 #, python-format
 msgid "(binary file %s, hash: %s)"
 msgstr "(arquivo binário %s, hash: %s)"
@@ -24284,6 +24249,9 @@
 msgid "cannot %s; remote repository does not support the %r capability"
 msgstr "impossível %s; repositório remoto não suporta a funcionalidade '%r'"
 
+msgid "cannot lookup negative revision"
+msgstr "não é possível buscar por uma revisão negativa"
+
 msgid "cannot change null revision phase"
 msgstr "não é possível mudar a fase da revisão nula"
 
@@ -26253,6 +26221,12 @@
 msgid "command '%s' failed: %s"
 msgstr "falha ao executar o comando '%s' : %s"
 
+msgid "filename ends with '\\', which is invalid on Windows"
+msgstr "o nome de arquivo termina em '\\', o que não é permitido em Windows"
+
+msgid "directory name ends with '\\', which is invalid on Windows"
+msgstr "o nome de diretório termina em '\\', o que não é permitido em Windows"
+
 #, python-format
 msgid "filename contains '%s', which is reserved on Windows"
 msgstr "o nome de arquivo contém '%s', que é um nome reservado em Windows"
--- a/mercurial/cmdutil.py	Sun Nov 17 20:22:59 2013 -0500
+++ b/mercurial/cmdutil.py	Tue Nov 19 11:29:56 2013 -0500
@@ -940,9 +940,7 @@
 
     tmpl = opts.get('template')
     style = None
-    if tmpl:
-        tmpl = templater.parsestring(tmpl, quoted=False)
-    else:
+    if not tmpl:
         style = opts.get('style')
 
     # ui settings
--- a/mercurial/templater.py	Sun Nov 17 20:22:59 2013 -0500
+++ b/mercurial/templater.py	Tue Nov 19 11:29:56 2013 -0500
@@ -52,7 +52,7 @@
                     if not decode:
                         yield ('string', program[s:pos].replace('\\', r'\\'), s)
                         break
-                    yield ('string', program[s:pos].decode('string-escape'), s)
+                    yield ('string', program[s:pos], s)
                     break
                 pos += 1
             else:
@@ -80,19 +80,19 @@
     parsed = []
     pos, stop = 0, len(tmpl)
     p = parser.parser(tokenizer, elements)
-
     while pos < stop:
         n = tmpl.find('{', pos)
         if n < 0:
-            parsed.append(("string", tmpl[pos:]))
+            parsed.append(("string", tmpl[pos:].decode("string-escape")))
             break
         if n > 0 and tmpl[n - 1] == '\\':
             # escaped
-            parsed.append(("string", tmpl[pos:n - 1] + "{"))
+            parsed.append(("string",
+                           (tmpl[pos:n - 1] + "{").decode("string-escape")))
             pos = n + 1
             continue
         if n > pos:
-            parsed.append(("string", tmpl[pos:n]))
+            parsed.append(("string", tmpl[pos:n].decode("string-escape")))
 
         pd = [tmpl, n + 1, stop]
         parseres, pos = p.parse(pd)
@@ -258,6 +258,13 @@
     key = args[1][0](context, mapping, args[1][1])
     yield dictarg.get(key)
 
+def _evalifliteral(arg, context, mapping):
+    t = stringify(arg[0](context, mapping, arg[1]))
+    if arg[0] == runstring:
+        yield runtemplate(context, mapping, compiletemplate(t, context))
+    else:
+        yield t
+
 def if_(context, mapping, args):
     if not (2 <= len(args) <= 3):
         # i18n: "if" is a keyword
@@ -265,11 +272,9 @@
 
     test = stringify(args[0][0](context, mapping, args[0][1]))
     if test:
-        t = stringify(args[1][0](context, mapping, args[1][1]))
-        yield runtemplate(context, mapping, compiletemplate(t, context))
+        yield _evalifliteral(args[1], context, mapping)
     elif len(args) == 3:
-        t = stringify(args[2][0](context, mapping, args[2][1]))
-        yield runtemplate(context, mapping, compiletemplate(t, context))
+        yield _evalifliteral(args[2], context, mapping)
 
 def ifeq(context, mapping, args):
     if not (3 <= len(args) <= 4):
@@ -279,11 +284,9 @@
     test = stringify(args[0][0](context, mapping, args[0][1]))
     match = stringify(args[1][0](context, mapping, args[1][1]))
     if test == match:
-        t = stringify(args[2][0](context, mapping, args[2][1]))
-        yield runtemplate(context, mapping, compiletemplate(t, context))
+        yield _evalifliteral(args[2], context, mapping)
     elif len(args) == 4:
-        t = stringify(args[3][0](context, mapping, args[3][1]))
-        yield runtemplate(context, mapping, compiletemplate(t, context))
+        yield _evalifliteral(args[3], context, mapping)
 
 def join(context, mapping, args):
     if not (1 <= len(args) <= 2):
@@ -313,8 +316,7 @@
         raise error.ParseError(_("label expects two arguments"))
 
     # ignore args[0] (the label string) since this is supposed to be a a no-op
-    t = stringify(args[1][0](context, mapping, args[1][1]))
-    yield runtemplate(context, mapping, compiletemplate(t, context))
+    yield _evalifliteral(args[1], context, mapping)
 
 def rstdoc(context, mapping, args):
     if len(args) != 2:
--- a/mercurial/templates/paper/shortlog.tmpl	Sun Nov 17 20:22:59 2013 -0500
+++ b/mercurial/templates/paper/shortlog.tmpl	Tue Nov 19 11:29:56 2013 -0500
@@ -80,8 +80,8 @@
                 return m ? m[1] : null;
             },
             '.bigtable > tbody:nth-of-type(2)',
-            '<tr class="%class%">\
-            <td colspan="3" style="text-align: center;">%text%</td>\
+            '<tr class="%class%">\\
+            <td colspan="3" style="text-align: center;">%text%</td>\\
             </tr>'
     );
 </script>
--- a/tests/test-command-template.t	Sun Nov 17 20:22:59 2013 -0500
+++ b/tests/test-command-template.t	Tue Nov 19 11:29:56 2013 -0500
@@ -1601,3 +1601,23 @@
   date: 70 01 01 02 +0000
   date: 70 01 01 01 +0000
   date: 70 01 01 00 +0000
+
+Test string escaping:
+  
+  $ hg log -R latesttag -r 0 --template '>\n<>\\n<{if(rev, "[>\n<>\\n<]")}>\n<>\\n<\n'
+  >
+  <>\n<[>
+  <>\n<]>
+  <>\n<
+
+Test recursive evaluation:
+
+  $ hg init r
+  $ cd r
+  $ echo a > a
+  $ hg ci -Am '{rev}'
+  adding a
+  $ hg log -r 0 --template '{if(rev, desc)}\n'
+  {rev}
+  $ hg log -r 0 --template '{if(rev, "{author} {rev}")}\n'
+  test 0
--- a/tests/test-histedit-drop.t	Sun Nov 17 20:22:59 2013 -0500
+++ b/tests/test-histedit-drop.t	Tue Nov 19 11:29:56 2013 -0500
@@ -97,6 +97,7 @@
 Check histedit_source
 
   $ hg log --debug --rev f518305ce889
+  invalid branchheads cache (visible): tip differs
   changeset:   4:f518305ce889c07cb5bd05522176d75590ef3324
   tag:         tip
   phase:       draft