##// END OF EJS Templates
merge with stable
Augie Fackler -
r35164:ee64e677 merge default
parent child Browse files
Show More
@@ -0,0 +1,154 b''
1 #testcases obsstore-off obsstore-on
2
3 $ cat << EOF >> $HGRCPATH
4 > [extensions]
5 > amend =
6 > EOF
7
8 #if obsstore-on
9 $ cat << EOF >> $HGRCPATH
10 > [experimental]
11 > evolution.createmarkers = True
12 > EOF
13 #endif
14
15 Prepare parent repo
16 -------------------
17
18 $ hg init r
19 $ cd r
20
21 $ echo a > a
22 $ hg ci -Am0
23 adding a
24
25 Link first subrepo
26 ------------------
27
28 $ echo 's = s' >> .hgsub
29 $ hg add .hgsub
30 $ hg init s
31
32 amend without .hgsub
33
34 $ hg amend s
35 abort: can't commit subrepos without .hgsub
36 [255]
37
38 amend with subrepo
39
40 $ hg amend
41 saved backup bundle to * (glob) (obsstore-off !)
42 $ hg status --change .
43 A .hgsub
44 A .hgsubstate
45 A a
46 $ cat .hgsubstate
47 0000000000000000000000000000000000000000 s
48
49 Update subrepo
50 --------------
51
52 add new commit to be amended
53
54 $ echo a >> a
55 $ hg ci -m1
56
57 amend with dirty subrepo
58
59 $ echo a >> s/a
60 $ hg add -R s
61 adding s/a
62 $ hg amend
63 abort: uncommitted changes in subrepository "s"
64 (use --subrepos for recursive commit)
65 [255]
66
67 amend with modified subrepo
68
69 $ hg ci -R s -m0
70 $ hg amend
71 saved backup bundle to * (glob) (obsstore-off !)
72 $ hg status --change .
73 M .hgsubstate
74 M a
75 $ cat .hgsubstate
76 f7b1eb17ad24730a1651fccd46c43826d1bbc2ac s
77
78 revert subrepo change
79
80 $ hg up -R s -q null
81 $ hg amend
82 saved backup bundle to * (glob) (obsstore-off !)
83 $ hg status --change .
84 M a
85
86 Link another subrepo
87 --------------------
88
89 add new commit to be amended
90
91 $ echo b >> b
92 $ hg ci -qAm2
93
94 also checks if non-subrepo change is included
95
96 $ echo a >> a
97
98 amend with another subrepo
99
100 $ hg init t
101 $ echo b >> t/b
102 $ hg ci -R t -Am0
103 adding b
104 $ echo 't = t' >> .hgsub
105 $ hg amend
106 saved backup bundle to * (glob) (obsstore-off !)
107 $ hg status --change .
108 M .hgsub
109 M .hgsubstate
110 M a
111 A b
112 $ cat .hgsubstate
113 0000000000000000000000000000000000000000 s
114 bfb1a4fb358498a9533dabf4f2043d94162f1fcd t
115
116 Unlink one subrepo
117 ------------------
118
119 add new commit to be amended
120
121 $ echo a >> a
122 $ hg ci -m3
123
124 amend with one subrepo dropped
125
126 $ echo 't = t' > .hgsub
127 $ hg amend
128 saved backup bundle to * (glob) (obsstore-off !)
129 $ hg status --change .
130 M .hgsub
131 M .hgsubstate
132 M a
133 $ cat .hgsubstate
134 bfb1a4fb358498a9533dabf4f2043d94162f1fcd t
135
136 Unlink subrepos completely
137 --------------------------
138
139 add new commit to be amended
140
141 $ echo a >> a
142 $ hg ci -m3
143
144 amend with .hgsub removed
145
146 $ hg rm .hgsub
147 $ hg amend
148 saved backup bundle to * (glob) (obsstore-off !)
149 $ hg status --change .
150 M a
151 R .hgsub
152 R .hgsubstate
153
154 $ cd ..
@@ -28,103 +28,6 b' command = registrar.command(cmdtable)'
28 28 # leave the attribute unspecified.
29 29 testedwith = 'ships-with-hg-core'
30 30
31 configtable = {}
32 configitem = registrar.configitem(configtable)
33
34 configitem('convert', 'cvsps.cache',
35 default=True,
36 )
37 configitem('convert', 'cvsps.fuzz',
38 default=60,
39 )
40 configitem('convert', 'cvsps.logencoding',
41 default=None,
42 )
43 configitem('convert', 'cvsps.mergefrom',
44 default=None,
45 )
46 configitem('convert', 'cvsps.mergeto',
47 default=None,
48 )
49 configitem('convert', 'git.committeractions',
50 default=lambda: ['messagedifferent'],
51 )
52 configitem('convert', 'git.extrakeys',
53 default=list,
54 )
55 configitem('convert', 'git.findcopiesharder',
56 default=False,
57 )
58 configitem('convert', 'git.remoteprefix',
59 default='remote',
60 )
61 configitem('convert', 'git.renamelimit',
62 default=400,
63 )
64 configitem('convert', 'git.saverev',
65 default=True,
66 )
67 configitem('convert', 'git.similarity',
68 default=50,
69 )
70 configitem('convert', 'git.skipsubmodules',
71 default=False,
72 )
73 configitem('convert', 'hg.clonebranches',
74 default=False,
75 )
76 configitem('convert', 'hg.ignoreerrors',
77 default=False,
78 )
79 configitem('convert', 'hg.revs',
80 default=None,
81 )
82 configitem('convert', 'hg.saverev',
83 default=False,
84 )
85 configitem('convert', 'hg.sourcename',
86 default=None,
87 )
88 configitem('convert', 'hg.startrev',
89 default=None,
90 )
91 configitem('convert', 'hg.tagsbranch',
92 default='default',
93 )
94 configitem('convert', 'hg.usebranchnames',
95 default=True,
96 )
97 configitem('convert', 'ignoreancestorcheck',
98 default=False,
99 )
100 configitem('convert', 'localtimezone',
101 default=False,
102 )
103 configitem('convert', 'p4.encoding',
104 default=lambda: convcmd.orig_encoding,
105 )
106 configitem('convert', 'p4.startrev',
107 default=0,
108 )
109 configitem('convert', 'skiptags',
110 default=False,
111 )
112 configitem('convert', 'svn.debugsvnlog',
113 default=True,
114 )
115 configitem('convert', 'svn.trunk',
116 default=None,
117 )
118 configitem('convert', 'svn.tags',
119 default=None,
120 )
121 configitem('convert', 'svn.branches',
122 default=None,
123 )
124 configitem('convert', 'svn.startrev',
125 default=0,
126 )
127
128 31 # Commands definition was moved elsewhere to ease demandload job.
129 32
130 33 @command('convert',
@@ -44,6 +44,9 b' def decodefilename(filename):'
44 44
45 45 class p4_source(common.converter_source):
46 46 def __init__(self, ui, path, revs=None):
47 # avoid import cycle
48 from . import convcmd
49
47 50 super(p4_source, self).__init__(ui, path, revs=revs)
48 51
49 52 if "/" in path and not path.startswith('//'):
@@ -53,7 +56,8 b' class p4_source(common.converter_source)'
53 56 common.checktool('p4', abort=False)
54 57
55 58 self.revmap = {}
56 self.encoding = self.ui.config('convert', 'p4.encoding')
59 self.encoding = self.ui.config('convert', 'p4.encoding',
60 convcmd.orig_encoding)
57 61 self.re_type = re.compile(
58 62 "([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)"
59 63 "(\+\w+)?$")
@@ -1512,10 +1512,10 b' msgid " Please use :hg:`log` instead:'
1512 1512 msgstr " Por favor use :hg:`log`::"
1513 1513
1514 1514 msgid ""
1515 " hg children => hg log -r \"children()\"\n"
1515 " hg children => hg log -r \"children(.)\"\n"
1516 1516 " hg children -r REV => hg log -r \"children(REV)\""
1517 1517 msgstr ""
1518 " hg children => hg log -r \"children()\"\n"
1518 " hg children => hg log -r \"children(.)\"\n"
1519 1519 " hg children -r REV => hg log -r \"children(REV)\""
1520 1520
1521 1521 msgid " See :hg:`help log` and :hg:`help revsets.children`."
@@ -5510,7 +5510,7 b' msgstr "edi\xc3\xa7\xc3\xa3o de hist\xc3\xb3rico em andamento, n\xc3\xa3o \xc3\xa9 poss\xc3\xadvel remover %s"'
5510 5510 #. i18n: column positioning for "hg summary"
5511 5511 #, python-format
5512 5512 msgid "hist: %s (histedit --continue)\n"
5513 msgstr "hist: %s (histedit --continue)\n"
5513 msgstr "histedit: %s (histedit --continue)\n"
5514 5514
5515 5515 #, python-format
5516 5516 msgid "%d remaining"
@@ -6527,16 +6527,16 b' msgstr "largefiles a serem enviados (%d '
6527 6527
6528 6528 #. i18n: column positioning for "hg summary"
6529 6529 msgid "largefiles: (no remote repo)\n"
6530 msgstr "largefiles: (nenhum repositório remoto)\n"
6530 msgstr "largefiles: (nenhum repositório remoto)\n"
6531 6531
6532 6532 #. i18n: column positioning for "hg summary"
6533 6533 msgid "largefiles: (no files to upload)\n"
6534 msgstr "largefiles: (nenhum arquivo a ser enviado)\n"
6534 msgstr "largefiles: (nenhum arquivo a ser enviado)\n"
6535 6535
6536 6536 #. i18n: column positioning for "hg summary"
6537 6537 #, python-format
6538 6538 msgid "largefiles: %d entities for %d files to upload\n"
6539 msgstr "largefiles: %d entidades para %d arquivos a serem enviados\n"
6539 msgstr "largefiles: %d entidades para %d arquivos a serem enviados\n"
6540 6540
6541 6541 #, python-format
6542 6542 msgid "largefile %s is not in cache and could not be downloaded"
@@ -8265,11 +8265,11 b' msgstr "%d n\xc3\xa3o aplicados"'
8265 8265 #. i18n: column positioning for "hg summary"
8266 8266 #, python-format
8267 8267 msgid "mq: %s\n"
8268 msgstr "mq: %s\n"
8268 msgstr "mq: %s\n"
8269 8269
8270 8270 #. i18n: column positioning for "hg summary"
8271 8271 msgid "mq: (empty queue)\n"
8272 msgstr "mq: (fila vazia)\n"
8272 msgstr "mq: (fila vazia)\n"
8273 8273
8274 8274 msgid ""
8275 8275 "``mq()``\n"
@@ -9799,12 +9799,12 b' msgstr "--tool s\xc3\xb3 pode ser usada em conjunto com --rebase"'
9799 9799
9800 9800 #. i18n: column positioning for "hg summary"
9801 9801 msgid "rebase: (use \"hg rebase --abort\" to clear broken state)\n"
9802 msgstr "rebase: (use \"hg rebase --abort\" para limpar o estado quebrado)\n"
9802 msgstr "rebase: (use \"hg rebase --abort\" para limpar o estado quebrado)\n"
9803 9803
9804 9804 #. i18n: column positioning for "hg summary"
9805 9805 #, python-format
9806 9806 msgid "rebase: %s, %s (rebase --continue)\n"
9807 msgstr "rebase: %s, %s (rebase --continue)\n"
9807 msgstr "rebase: %s, %s (rebase --continue)\n"
9808 9808
9809 9809 #, python-format
9810 9810 msgid "%d rebased"
@@ -10492,7 +10492,7 b' msgstr ""'
10492 10492 " caminho ou URL pedida em :hg:`clone` for idêntico a um repositório\n"
10493 10493 " que tenha sido clonado anteriormente."
10494 10494
10495 msgid " The default naming mode is \"identity.\"\n"
10495 msgid " The default naming mode is \"identity\".\n"
10496 10496 msgstr " O modo de nomeação padrão é \"identity\".\n"
10497 10497
10498 10498 msgid "do not create a working directory"
@@ -12157,7 +12157,7 b' msgstr ""'
12157 12157 #. i18n: column positioning for "hg summary"
12158 12158 #, python-format
12159 12159 msgid "remote: %s\n"
12160 msgstr "remoto: %s\n"
12160 msgstr "remoto: %s\n"
12161 12161
12162 12162 msgid "push failed:"
12163 12163 msgstr "o push falhou:"
@@ -15012,7 +15012,7 b' msgstr " (grafted from CHANGESETHAS'
15012 15012
15013 15013 msgid ""
15014 15014 " If --force is specified, revisions will be grafted even if they\n"
15015 " are already ancestors of or have been grafted to the destination.\n"
15015 " are already ancestors of, or have been grafted to, the destination.\n"
15016 15016 " This is useful when the revisions have since been backed out."
15017 15017 msgstr ""
15018 15018 " Se --force for especificado, as revisões serão enxertadas mesmo\n"
@@ -15705,11 +15705,12 b' msgstr "mostra novas revis\xc3\xb5es encontradas na origem"'
15705 15705 msgid ""
15706 15706 " Show new changesets found in the specified path/URL or the default\n"
15707 15707 " pull location. These are the changesets that would have been pulled\n"
15708 " if a pull at the time you issued this command."
15708 " by :hg:`pull` at the time you issued this command."
15709 15709 msgstr ""
15710 15710 " Mostra novas revisões encontradas no caminho/URL especificado\n"
15711 15711 " ou na localização de pull padrão. Estas são as revisões que\n"
15712 " seriam trazidas se um pull fosse executado."
15712 " seriam trazidas por :hg:`pull` no momento da execução deste\n"
15713 " comando."
15713 15714
15714 15715 msgid " See pull for valid source format details."
15715 15716 msgstr " Veja pull para detalhes sobre formatos válidos da origem."
@@ -16442,8 +16443,8 b' msgstr ""'
16442 16443 " secreta, respectivamente."
16443 16444
16444 16445 msgid ""
16445 " Unless -f/--force is specified, :hg:`phase` won't move changeset from a\n"
16446 " lower phase to an higher phase. Phases are ordered as follows::"
16446 " Unless -f/--force is specified, :hg:`phase` won't move changesets from a\n"
16447 " lower phase to a higher phase. Phases are ordered as follows::"
16447 16448 msgstr ""
16448 16449 " A não ser que -f/--force seja especificado, :hg:`phase` não\n"
16449 16450 " moverá revisões de uma fase mais baixa para uma mais alta. As\n"
@@ -17449,13 +17450,14 b' msgstr ""'
17449 17450 " 'i' 'ignorado' e 'c' 'limpo'."
17450 17451
17451 17452 msgid ""
17452 " It abbreviates only those statuses which are passed. Note that ignored\n"
17453 " files are not displayed with '--terse i' unless the -i/--ignored option is\n"
17454 " also used."
17453 " It abbreviates only those statuses which are passed. Note that clean and\n"
17454 " ignored files are not displayed with '--terse ic' unless the -c/--clean\n"
17455 " and -i/--ignored options are also used."
17455 17456 msgstr ""
17456 17457 " A saída será abreviada apenas para os status que forem passados.\n"
17457 " Note que arquivos ignorados não serão mostrados com '--terse i'\n"
17458 " a não ser que a opção -i/--ignored também seja usada."
17458 " Note que arquivos limpos ou ignorados não serão mostrados com\n"
17459 " '--terse ic' a não ser que as opções -c/--clean e -i/--ignored\n"
17460 " também sejam usadas."
17459 17461
17460 17462 msgid ""
17461 17463 " The -v/--verbose option shows information when the repository is in an\n"
@@ -17554,7 +17556,7 b' msgstr ""'
17554 17556 #. i18n: column positioning for "hg summary"
17555 17557 #, python-format
17556 17558 msgid "parent: %d:%s "
17557 msgstr "pai: %d:%s "
17559 msgstr "pai: %d:%s "
17558 17560
17559 17561 msgid " (empty repository)"
17560 17562 msgstr " (repositório vazio)"
@@ -17568,11 +17570,11 b' msgstr " (obsoleto)"'
17568 17570 #. i18n: column positioning for "hg summary"
17569 17571 #, python-format
17570 17572 msgid "branch: %s\n"
17571 msgstr "ramo: %s\n"
17573 msgstr "ramo: %s\n"
17572 17574
17573 17575 #. i18n: column positioning for "hg summary"
17574 17576 msgid "bookmarks:"
17575 msgstr "marcadores: "
17577 msgstr "marcadores: "
17576 17578
17577 17579 #, python-format
17578 17580 msgid "%d modified"
@@ -17634,21 +17636,21 b' msgstr " (nova cabe\xc3\xa7a de ramo)"'
17634 17636 #. i18n: column positioning for "hg summary"
17635 17637 #, python-format
17636 17638 msgid "commit: %s\n"
17637 msgstr "consolidação: %s\n"
17639 msgstr "consolidação: %s\n"
17638 17640
17639 17641 #. i18n: column positioning for "hg summary"
17640 17642 msgid "update: (current)\n"
17641 msgstr "atualizações: (atual)\n"
17643 msgstr "atualizações: (atual)\n"
17642 17644
17643 17645 #. i18n: column positioning for "hg summary"
17644 17646 #, python-format
17645 17647 msgid "update: %d new changesets (update)\n"
17646 msgstr "atualizações: %d novas revisões (update)\n"
17648 msgstr "atualizações: %d novas revisões (update)\n"
17647 17649
17648 17650 #. i18n: column positioning for "hg summary"
17649 17651 #, python-format
17650 17652 msgid "update: %d new changesets, %d branch heads (merge)\n"
17651 msgstr "atualizações: %d novas revisões, %d cabeças de ramo (merge)\n"
17653 msgstr "atualizações: %d novas revisões, %d cabeças de ramo (merge)\n"
17652 17654
17653 17655 #, python-format
17654 17656 msgid "%d draft"
@@ -17660,7 +17662,7 b' msgstr "%d em fase secret"'
17660 17662
17661 17663 #, python-format
17662 17664 msgid "phases: %s\n"
17663 msgstr "fases: %s\n"
17665 msgstr "fases: %s\n"
17664 17666
17665 17667 #, python-format
17666 17668 msgid "orphan: %d changesets"
@@ -17691,7 +17693,7 b' msgstr "%d marcadores a serem enviados"'
17691 17693
17692 17694 #. i18n: column positioning for "hg summary"
17693 17695 msgid "remote: (synced)\n"
17694 msgstr "remoto: (sincronizado)\n"
17696 msgstr "remoto: (sincronizado)\n"
17695 17697
17696 17698 msgid "force tag"
17697 17699 msgstr "força a mudança da etiqueta"
@@ -20935,6 +20937,9 b' msgstr "Censura"'
20935 20937 msgid "Changegroups"
20936 20938 msgstr "Changegroups"
20937 20939
20940 msgid "Config Registrar"
20941 msgstr "Registrador de Configurações"
20942
20938 20943 msgid "Repository Requirements"
20939 20944 msgstr "Requisitos do Repositório"
20940 20945
@@ -23843,25 +23848,31 b' msgid ""'
23843 23848 " Run right before a phase change is actually finalized. Any repository change\n"
23844 23849 " will be visible to the hook program. This lets you validate the transaction\n"
23845 23850 " content or change it. Exit status 0 allows the commit to proceed. A non-zero\n"
23846 " status will cause the transaction to be rolled back.\n"
23851 " status will cause the transaction to be rolled back. The hook is called\n"
23852 " multiple times, once for each revision affected by a phase change.\n"
23847 23853 " The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``\n"
23848 23854 " while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``\n"
23849 23855 " will be empty. In addition, the reason for the transaction opening will be in\n"
23850 23856 " ``$HG_TXNNAME``, and a unique identifier for the transaction will be in\n"
23851 " ``HG_TXNID``."
23852 msgstr ""
23853 "``pretxnclose``\n"
23857 " ``HG_TXNID``. The hook is also run for newly added revisions. In this case\n"
23858 " the ``$HG_OLDPHASE`` entry will be empty."
23859 msgstr ""
23860 "``pretxnclose-phase``\n"
23854 23861 " Executado imediatamente antes de uma mudança de fase ser finalizada.\n"
23855 23862 " Qualquer mudança do repositório será visível para o gancho.\n"
23856 23863 " Isto permite que o conteúdo da transação seja validado ou alterado.\n"
23857 23864 " O status de saída 0 permite que a consolidação prossiga. Um status\n"
23858 23865 " de saída diferente de zero fará com que a transação seja desfeita.\n"
23866 " O gancho é chamado diversas vezes, uma para cada revisão afetada\n"
23867 " pela mudança de fase.\n"
23859 23868 " O nó afetado será passado em ``$HG_NODE``, a nova fase em ``$HG_PHASE``\n"
23860 23869 " e a anterior em ``$HG_OLDPHASE``.\n"
23861 23870 " No caso de um novo nó, ``$HG_OLDPHASE`` estará vazia.\n"
23862 23871 " Adicionalmente, a razão da abertura da transação será passada em\n"
23863 23872 " ``$HG_TXNNAME``, e um identificador único para a transação será\n"
23864 " passado em ``HG_TXNID``."
23873 " passado em ``HG_TXNID``.\n"
23874 " O gancho também será executado para revisões novas; nesse caso,\n"
23875 " ``$HG_OLDPHASE`` estará vazia."
23865 23876
23866 23877 msgid ""
23867 23878 "``txnclose``\n"
@@ -25832,6 +25843,105 b' msgstr ""'
25832 25843 "As regras são aplicadas na ordem de definição."
25833 25844
25834 25845 msgid ""
25846 "``subrepos``\n"
25847 "------------"
25848 msgstr ""
25849 "``subrepos``\n"
25850 "------------"
25851
25852 msgid ""
25853 "This section contains options that control the behavior of the\n"
25854 "subrepositories feature. See also :hg:`help subrepos`."
25855 msgstr ""
25856 "Esta seção contém opções que controlam o comportamento\n"
25857 "da funcionalidade de sub-repositórios.\n"
25858 "Veja também :hg:`help subrepos`."
25859
25860 msgid ""
25861 "Security note: auditing in Mercurial is known to be insufficient to\n"
25862 "prevent clone-time code execution with carefully constructed Git\n"
25863 "subrepos. It is unknown if a similar detect is present in Subversion\n"
25864 "subrepos. Both Git and Subversion subrepos are disabled by default\n"
25865 "out of security concerns. These subrepo types can be enabled using\n"
25866 "the respective options below."
25867 msgstr ""
25868 "Aviso de segurança: sabe-se que a auditoria no Mercurial é\n"
25869 "insuficiente para impedir execução de código no momento da\n"
25870 "clonagem com repositórios Git construídos maliciosamente.\n"
25871 "Não se sabe se esse problema afeta repositórios do Subversion.\n"
25872 "Tanto sub-repositórios do Git como do Subversion são por padrão\n"
25873 "desabilitados por razões de segurança.\n"
25874 "Esses tipos de sub-repositórios podem ser habilitados usando as\n"
25875 "respectivas opções abaixo."
25876
25877 msgid ""
25878 "``allowed``\n"
25879 " Whether subrepositories are allowed in the working directory."
25880 msgstr ""
25881 "``allowed``\n"
25882 " Define se sub-repositórios são permitidos no diretório\n"
25883 " de trabalho."
25884
25885 msgid ""
25886 " When false, commands involving subrepositories (like :hg:`update`)\n"
25887 " will fail for all subrepository types.\n"
25888 " (default: true)"
25889 msgstr ""
25890 " Se False, comandos envolvendo sub-repositórios (como :hg:`update`)\n"
25891 " falharão para todos os tipos de sub-repositório.\n"
25892 " (padrão: True)"
25893
25894 msgid ""
25895 "``hg:allowed``\n"
25896 " Whether Mercurial subrepositories are allowed in the working\n"
25897 " directory. This option only has an effect if ``subrepos.allowed``\n"
25898 " is true.\n"
25899 " (default: true)"
25900 msgstr ""
25901 "``hg:allowed``\n"
25902 " Se sub-repositórios do Mercurial são permitidos no diretório\n"
25903 " de trabalho.\n"
25904 " Esta opção tem efeito apenas se ``subrepos.allowed`` for True.\n"
25905 " (padrão: True)"
25906
25907 msgid ""
25908 "``git:allowed``\n"
25909 " Whether Git subrepositories are allowed in the working directory.\n"
25910 " This option only has an effect if ``subrepos.allowed`` is true."
25911 msgstr ""
25912 "``git:allowed``\n"
25913 " Se sub-repositórios do Git são permitidos no diretório\n"
25914 " de trabalho.\n"
25915 " Esta opção tem efeito apenas se ``subrepos.allowed`` for True."
25916
25917 msgid ""
25918 " See the security note above before enabling Git subrepos.\n"
25919 " (default: false)"
25920 msgstr ""
25921 " Veja o aviso de segurança acima antes de habilitar\n"
25922 " sub-repositórios do Git.\n"
25923 " (padrão: False)"
25924
25925 msgid ""
25926 "``svn:allowed``\n"
25927 " Whether Subversion subrepositories are allowed in the working\n"
25928 " directory. This option only has an effect if ``subrepos.allowed``\n"
25929 " is true."
25930 msgstr ""
25931 "``svn:allowed``\n"
25932 " Se sub-repositórios do Subversion são permitidos no diretório\n"
25933 " de trabalho.\n"
25934 " Esta opção tem efeito apenas se ``subrepos.allowed`` for True."
25935
25936 msgid ""
25937 " See the security note above before enabling Subversion subrepos.\n"
25938 " (default: false)"
25939 msgstr ""
25940 " Veja o aviso de segurança acima antes de habilitar\n"
25941 " sub-repositórios do Subversion.\n"
25942 " (padrão: False)"
25943
25944 msgid ""
25835 25945 "``templatealias``\n"
25836 25946 "-----------------"
25837 25947 msgstr ""
@@ -29958,7 +30068,7 b' msgstr "8. Caso contr\xc3\xa1rio, ``:prompt`` ser\xc3\xa1 usado."'
29958 30068 msgid ""
29959 30069 " After selecting a merge program, Mercurial will by default attempt\n"
29960 30070 " to merge the files using a simple merge algorithm first. Only if it doesn't\n"
29961 " succeed because of conflicting changes Mercurial will actually execute the\n"
30071 " succeed because of conflicting changes will Mercurial actually execute the\n"
29962 30072 " merge program. Whether to use the simple merge algorithm first can be\n"
29963 30073 " controlled by the premerge setting of the merge tool. Premerge is enabled by\n"
29964 30074 " default unless the file is binary or a symlink."
@@ -30334,7 +30444,7 b' msgstr ""'
30334 30444 "Veja :hg:`help -v phase` para alguns exemplos."
30335 30445
30336 30446 msgid ""
30337 "To make yours commits secret by default, put this in your\n"
30447 "To make your commits secret by default, put this in your\n"
30338 30448 "configuration file::"
30339 30449 msgstr ""
30340 30450 "Para colocar suas consolidações na fase secret por padrão,\n"
@@ -30453,7 +30563,7 b' msgstr ""'
30453 30563 msgid " hg phase --force --draft ."
30454 30564 msgstr " hg phase --force --draft ."
30455 30565
30456 msgid " - show a list of changeset revision and phase::"
30566 msgid " - show a list of changeset revisions and each corresponding phase::"
30457 30567 msgstr " - mostra uma lista de números de revisão e suas respectivas fases::"
30458 30568
30459 30569 msgid " hg log --template \"{rev} {phase}\\n\""
@@ -30755,7 +30865,7 b' msgstr ""'
30755 30865
30756 30866 msgid ""
30757 30867 "For example, ``tag(r're:(?i)release')`` matches \"release\" or \"RELEASE\"\n"
30758 "or \"Release\", etc"
30868 "or \"Release\", etc."
30759 30869 msgstr ""
30760 30870 "Por exemplo, ``tag(r're:(?i)release')`` corresponde a \"release\"\n"
30761 30871 "ou \"RELEASE\" ou \"Release\", etc."
@@ -30886,7 +30996,7 b' msgstr ""'
30886 30996 " hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tag())\""
30887 30997
30888 30998 msgid ""
30889 "- Update to commit that bookmark @ is pointing too, without activating the\n"
30999 "- Update to the commit that bookmark @ is pointing to, without activating the\n"
30890 31000 " bookmark (this works because the last revision of the revset is used)::"
30891 31001 msgstr ""
30892 31002 "- Atualiza para a revisão que o marcador @ está apontando, sem ativar\n"
@@ -33530,12 +33640,12 b' msgstr "Aviso!"'
33530 33640 #. i18n: column positioning for "hg log"
33531 33641 #, python-format
33532 33642 msgid "bookmark: %s\n"
33533 msgstr "marcador: %s\n"
33643 msgstr "marcador: %s\n"
33534 33644
33535 33645 #. i18n: column positioning for "hg log"
33536 33646 #, python-format
33537 33647 msgid "tag: %s\n"
33538 msgstr "etiqueta: %s\n"
33648 msgstr "etiqueta: %s\n"
33539 33649
33540 33650 #, python-format
33541 33651 msgid "no such name: %s"
@@ -36031,6 +36141,20 b' msgid "warning: removing potentially hos'
36031 36141 msgstr "aviso: removendo 'hgrc' potencialmente hostil em '%s'\n"
36032 36142
36033 36143 #, python-format
36144 msgid "subrepo '%s' traverses symbolic link"
36145 msgstr "o sub-repositório '%s' atravessa um link simbólico"
36146
36147 msgid "subrepos not enabled"
36148 msgstr "sub-repositórios não estão habilitados"
36149
36150 msgid "see 'hg help config.subrepos' for details"
36151 msgstr "veja 'hg help config.subrepos' para detalhes"
36152
36153 #, python-format
36154 msgid "%s subrepos not allowed"
36155 msgstr "sub-repositórios %s não são permitidos"
36156
36157 #, python-format
36034 36158 msgid "unknown subrepo type %s"
36035 36159 msgstr "tipo de sub-repositório %s desconhecido"
36036 36160
@@ -235,6 +235,7 b' def _loadnewui(srcui, args):'
235 235 cwds = dispatch._earlygetopt(['--cwd'], args)
236 236 cwd = cwds and os.path.realpath(cwds[-1]) or None
237 237 rpath = dispatch._earlygetopt(["-R", "--repository", "--repo"], args)
238 rpath = rpath and rpath[-1] or ''
238 239 path, newlui = dispatch._getlocal(newui, rpath, wd=cwd)
239 240
240 241 return (newui, newlui)
@@ -3166,6 +3166,18 b' def amend(ui, repo, old, extra, pats, op'
3166 3166 raise error.Abort(
3167 3167 _("failed to mark all new/missing files as added/removed"))
3168 3168
3169 # Check subrepos. This depends on in-place wctx._status update in
3170 # subrepo.precommit(). To minimize the risk of this hack, we do
3171 # nothing if .hgsub does not exist.
3172 if '.hgsub' in wctx or '.hgsub' in old:
3173 from . import subrepo # avoid cycle: cmdutil -> subrepo -> cmdutil
3174 subs, commitsubs, newsubstate = subrepo.precommit(
3175 ui, wctx, wctx._status, matcher)
3176 # amend should abort if commitsubrepos is enabled
3177 assert not commitsubs
3178 if subs:
3179 subrepo.writestate(repo, newsubstate)
3180
3169 3181 filestoamend = set(f for f in wctx.files() if matcher(f))
3170 3182
3171 3183 changes = (len(filestoamend) > 0)
@@ -3179,9 +3191,11 b' def amend(ui, repo, old, extra, pats, op'
3179 3191 # introduced file X and the file was renamed in the working
3180 3192 # copy, then those two files are the same and
3181 3193 # we can discard X from our list of files. Likewise if X
3182 # was deleted, it's no longer relevant
3194 # was removed, it's no longer relevant. If X is missing (aka
3195 # deleted), old X must be preserved.
3183 3196 files.update(filestoamend)
3184 files = [f for f in files if not samefile(f, wctx, base)]
3197 files = [f for f in files if (not samefile(f, wctx, base)
3198 or f in wctx.deleted())]
3185 3199
3186 3200 def filectxfn(repo, ctx_, path):
3187 3201 try:
@@ -3193,12 +3207,11 b' def amend(ui, repo, old, extra, pats, op'
3193 3207 if path not in filestoamend:
3194 3208 return old.filectx(path)
3195 3209
3210 # Return None for removed files.
3211 if path in wctx.removed():
3212 return None
3213
3196 3214 fctx = wctx[path]
3197
3198 # Return None for removed files.
3199 if not fctx.exists():
3200 return None
3201
3202 3215 flags = fctx.flags()
3203 3216 mctx = context.memfilectx(repo,
3204 3217 fctx.path(), fctx.data(),
@@ -103,6 +103,10 b' globalopts = ['
103 103 _("when to paginate (boolean, always, auto, or never)"), _('TYPE')),
104 104 ]
105 105
106 # options which must be pre-parsed before loading configs and extensions
107 # TODO: perhaps --debugger should be included
108 earlyoptflags = ("--cwd", "-R", "--repository", "--repo", "--config")
109
106 110 dryrunopts = cmdutil.dryrunopts
107 111 remoteopts = cmdutil.remoteopts
108 112 walkopts = cmdutil.walkopts
@@ -208,6 +208,99 b" coreconfigitem('committemplate', '.*',"
208 208 default=None,
209 209 generic=True,
210 210 )
211 coreconfigitem('convert', 'cvsps.cache',
212 default=True,
213 )
214 coreconfigitem('convert', 'cvsps.fuzz',
215 default=60,
216 )
217 coreconfigitem('convert', 'cvsps.logencoding',
218 default=None,
219 )
220 coreconfigitem('convert', 'cvsps.mergefrom',
221 default=None,
222 )
223 coreconfigitem('convert', 'cvsps.mergeto',
224 default=None,
225 )
226 coreconfigitem('convert', 'git.committeractions',
227 default=lambda: ['messagedifferent'],
228 )
229 coreconfigitem('convert', 'git.extrakeys',
230 default=list,
231 )
232 coreconfigitem('convert', 'git.findcopiesharder',
233 default=False,
234 )
235 coreconfigitem('convert', 'git.remoteprefix',
236 default='remote',
237 )
238 coreconfigitem('convert', 'git.renamelimit',
239 default=400,
240 )
241 coreconfigitem('convert', 'git.saverev',
242 default=True,
243 )
244 coreconfigitem('convert', 'git.similarity',
245 default=50,
246 )
247 coreconfigitem('convert', 'git.skipsubmodules',
248 default=False,
249 )
250 coreconfigitem('convert', 'hg.clonebranches',
251 default=False,
252 )
253 coreconfigitem('convert', 'hg.ignoreerrors',
254 default=False,
255 )
256 coreconfigitem('convert', 'hg.revs',
257 default=None,
258 )
259 coreconfigitem('convert', 'hg.saverev',
260 default=False,
261 )
262 coreconfigitem('convert', 'hg.sourcename',
263 default=None,
264 )
265 coreconfigitem('convert', 'hg.startrev',
266 default=None,
267 )
268 coreconfigitem('convert', 'hg.tagsbranch',
269 default='default',
270 )
271 coreconfigitem('convert', 'hg.usebranchnames',
272 default=True,
273 )
274 coreconfigitem('convert', 'ignoreancestorcheck',
275 default=False,
276 )
277 coreconfigitem('convert', 'localtimezone',
278 default=False,
279 )
280 coreconfigitem('convert', 'p4.encoding',
281 default=dynamicdefault,
282 )
283 coreconfigitem('convert', 'p4.startrev',
284 default=0,
285 )
286 coreconfigitem('convert', 'skiptags',
287 default=False,
288 )
289 coreconfigitem('convert', 'svn.debugsvnlog',
290 default=True,
291 )
292 coreconfigitem('convert', 'svn.trunk',
293 default=None,
294 )
295 coreconfigitem('convert', 'svn.tags',
296 default=None,
297 )
298 coreconfigitem('convert', 'svn.branches',
299 default=None,
300 )
301 coreconfigitem('convert', 'svn.startrev',
302 default=0,
303 )
211 304 coreconfigitem('debug', 'dirstate.delaywrite',
212 305 default=0,
213 306 )
@@ -55,6 +55,9 b' class request(object):'
55 55 self.fout = fout
56 56 self.ferr = ferr
57 57
58 # remember options pre-parsed by _earlyreqopt*()
59 self.earlyoptions = {}
60
58 61 # reposetups which run before extensions, useful for chg to pre-fill
59 62 # low-level repo state (for example, changelog) before extensions.
60 63 self.prereposetups = prereposetups or []
@@ -147,7 +150,7 b' def dispatch(req):'
147 150 try:
148 151 if not req.ui:
149 152 req.ui = uimod.ui.load()
150 if '--traceback' in req.args:
153 if _earlyreqoptbool(req, 'traceback', ['--traceback']):
151 154 req.ui.setconfig('ui', 'traceback', 'on', '--traceback')
152 155
153 156 # set ui streams from the request
@@ -261,7 +264,8 b' def _runcatch(req):'
261 264
262 265 # read --config before doing anything else
263 266 # (e.g. to change trust settings for reading .hg/hgrc)
264 cfgs = _parseconfig(req.ui, _earlygetopt(['--config'], req.args))
267 cfgs = _parseconfig(req.ui,
268 _earlyreqopt(req, 'config', ['--config']))
265 269
266 270 if req.repo:
267 271 # copy configs that were passed on the cmdline (--config) to
@@ -275,7 +279,7 b' def _runcatch(req):'
275 279 if not debugger or ui.plain():
276 280 # if we are in HGPLAIN mode, then disable custom debugging
277 281 debugger = 'pdb'
278 elif '--debugger' in req.args:
282 elif _earlyreqoptbool(req, 'debugger', ['--debugger']):
279 283 # This import can be slow for fancy debuggers, so only
280 284 # do it when absolutely necessary, i.e. when actual
281 285 # debugging has been requested
@@ -289,7 +293,7 b' def _runcatch(req):'
289 293 debugmortem[debugger] = debugmod.post_mortem
290 294
291 295 # enter the debugger before command execution
292 if '--debugger' in req.args:
296 if _earlyreqoptbool(req, 'debugger', ['--debugger']):
293 297 ui.warn(_("entering debugger - "
294 298 "type c to continue starting hg or h for help\n"))
295 299
@@ -305,7 +309,7 b' def _runcatch(req):'
305 309 ui.flush()
306 310 except: # re-raises
307 311 # enter the debugger when we hit an exception
308 if '--debugger' in req.args:
312 if _earlyreqoptbool(req, 'debugger', ['--debugger']):
309 313 traceback.print_exc()
310 314 debugmortem[debugger](sys.exc_info()[2])
311 315 raise
@@ -465,7 +469,7 b' class cmdalias(object):'
465 469 self.cmdname = cmd = args.pop(0)
466 470 self.givenargs = args
467 471
468 for invalidarg in ("--cwd", "-R", "--repository", "--repo", "--config"):
472 for invalidarg in commands.earlyoptflags:
469 473 if _earlygetopt([invalidarg], args):
470 474 self.badalias = (_("error in definition for alias '%s': %s may "
471 475 "only be given on the command line")
@@ -640,11 +644,11 b' def _parseconfig(ui, config):'
640 644
641 645 return configs
642 646
643 def _earlygetopt(aliases, args):
647 def _earlygetopt(aliases, args, strip=True):
644 648 """Return list of values for an option (or aliases).
645 649
646 650 The values are listed in the order they appear in args.
647 The options and values are removed from args.
651 The options and values are removed from args if strip=True.
648 652
649 653 >>> args = [b'x', b'--cwd', b'foo', b'y']
650 654 >>> _earlygetopt([b'--cwd'], args), args
@@ -654,13 +658,33 b' def _earlygetopt(aliases, args):'
654 658 >>> _earlygetopt([b'--cwd'], args), args
655 659 (['bar'], ['x', 'y'])
656 660
661 >>> args = [b'x', b'--cwd=bar', b'y']
662 >>> _earlygetopt([b'--cwd'], args, strip=False), args
663 (['bar'], ['x', '--cwd=bar', 'y'])
664
657 665 >>> args = [b'x', b'-R', b'foo', b'y']
658 666 >>> _earlygetopt([b'-R'], args), args
659 667 (['foo'], ['x', 'y'])
660 668
669 >>> args = [b'x', b'-R', b'foo', b'y']
670 >>> _earlygetopt([b'-R'], args, strip=False), args
671 (['foo'], ['x', '-R', 'foo', 'y'])
672
661 673 >>> args = [b'x', b'-Rbar', b'y']
662 674 >>> _earlygetopt([b'-R'], args), args
663 675 (['bar'], ['x', 'y'])
676
677 >>> args = [b'x', b'-Rbar', b'y']
678 >>> _earlygetopt([b'-R'], args, strip=False), args
679 (['bar'], ['x', '-Rbar', 'y'])
680
681 >>> args = [b'x', b'-R=bar', b'y']
682 >>> _earlygetopt([b'-R'], args), args
683 (['=bar'], ['x', 'y'])
684
685 >>> args = [b'x', b'-R', b'--', b'y']
686 >>> _earlygetopt([b'-R'], args), args
687 ([], ['x', '-R', '--', 'y'])
664 688 """
665 689 try:
666 690 argcount = args.index("--")
@@ -671,28 +695,77 b' def _earlygetopt(aliases, args):'
671 695 pos = 0
672 696 while pos < argcount:
673 697 fullarg = arg = args[pos]
674 equals = arg.find('=')
698 equals = -1
699 if arg.startswith('--'):
700 equals = arg.find('=')
675 701 if equals > -1:
676 702 arg = arg[:equals]
677 703 if arg in aliases:
678 del args[pos]
679 704 if equals > -1:
680 705 values.append(fullarg[equals + 1:])
681 argcount -= 1
706 if strip:
707 del args[pos]
708 argcount -= 1
709 else:
710 pos += 1
682 711 else:
683 712 if pos + 1 >= argcount:
684 713 # ignore and let getopt report an error if there is no value
685 714 break
686 values.append(args.pop(pos))
687 argcount -= 2
715 values.append(args[pos + 1])
716 if strip:
717 del args[pos:pos + 2]
718 argcount -= 2
719 else:
720 pos += 2
688 721 elif arg[:2] in shortopts:
689 722 # short option can have no following space, e.g. hg log -Rfoo
690 values.append(args.pop(pos)[2:])
691 argcount -= 1
723 values.append(args[pos][2:])
724 if strip:
725 del args[pos]
726 argcount -= 1
727 else:
728 pos += 1
692 729 else:
693 730 pos += 1
694 731 return values
695 732
733 def _earlyreqopt(req, name, aliases):
734 """Peek a list option without using a full options table"""
735 values = _earlygetopt(aliases, req.args, strip=False)
736 req.earlyoptions[name] = values
737 return values
738
739 def _earlyreqoptstr(req, name, aliases):
740 """Peek a string option without using a full options table"""
741 value = (_earlygetopt(aliases, req.args, strip=False) or [''])[-1]
742 req.earlyoptions[name] = value
743 return value
744
745 def _earlyreqoptbool(req, name, aliases):
746 """Peek a boolean option without using a full options table
747
748 >>> req = request([b'x', b'--debugger'])
749 >>> _earlyreqoptbool(req, b'debugger', [b'--debugger'])
750 True
751
752 >>> req = request([b'x', b'--', b'--debugger'])
753 >>> _earlyreqoptbool(req, b'debugger', [b'--debugger'])
754 """
755 try:
756 argcount = req.args.index("--")
757 except ValueError:
758 argcount = len(req.args)
759 value = None
760 pos = 0
761 while pos < argcount:
762 arg = req.args[pos]
763 if arg in aliases:
764 value = True
765 pos += 1
766 req.earlyoptions[name] = value
767 return value
768
696 769 def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions):
697 770 # run pre-hook, and abort if it fails
698 771 hook.hook(lui, repo, "pre-%s" % cmd, True, args=" ".join(fullargs),
@@ -727,8 +800,8 b' def _getlocal(ui, rpath, wd=None):'
727 800 lui = ui.copy()
728 801 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path)
729 802
730 if rpath and rpath[-1]:
731 path = lui.expandpath(rpath[-1])
803 if rpath:
804 path = lui.expandpath(rpath)
732 805 lui = ui.copy()
733 806 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path)
734 807
@@ -759,6 +832,9 b' def _checkshellalias(lui, ui, args):'
759 832 fn = entry[0]
760 833
761 834 if cmd and util.safehasattr(fn, 'shell'):
835 # shell alias shouldn't receive early options which are consumed by hg
836 args = args[:]
837 _earlygetopt(commands.earlyoptflags, args, strip=True)
762 838 d = lambda: fn(ui, *args[1:])
763 839 return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d,
764 840 [], {})
@@ -768,11 +844,11 b' def _dispatch(req):'
768 844 ui = req.ui
769 845
770 846 # check for cwd
771 cwd = _earlygetopt(['--cwd'], args)
847 cwd = _earlyreqoptstr(req, 'cwd', ['--cwd'])
772 848 if cwd:
773 os.chdir(cwd[-1])
849 os.chdir(cwd)
774 850
775 rpath = _earlygetopt(["-R", "--repository", "--repo"], args)
851 rpath = _earlyreqoptstr(req, 'repository', ["-R", "--repository", "--repo"])
776 852 path, lui = _getlocal(ui, rpath)
777 853
778 854 uis = {ui, lui}
@@ -780,7 +856,7 b' def _dispatch(req):'
780 856 if req.repo:
781 857 uis.add(req.repo.ui)
782 858
783 if '--profile' in args:
859 if _earlyreqoptbool(req, 'profile', ['--profile']):
784 860 for ui_ in uis:
785 861 ui_.setconfig('profiling', 'enabled', 'true', '--profile')
786 862
@@ -812,14 +888,17 b' def _dispatch(req):'
812 888 fullargs = args
813 889 cmd, func, args, options, cmdoptions = _parse(lui, args)
814 890
815 if options["config"]:
891 if options["config"] != req.earlyoptions["config"]:
816 892 raise error.Abort(_("option --config may not be abbreviated!"))
817 if options["cwd"]:
893 if options["cwd"] != req.earlyoptions["cwd"]:
818 894 raise error.Abort(_("option --cwd may not be abbreviated!"))
819 if options["repository"]:
895 if options["repository"] != req.earlyoptions["repository"]:
820 896 raise error.Abort(_(
821 897 "option -R has to be separated from other options (e.g. not "
822 898 "-qR) and --repository may only be abbreviated as --repo!"))
899 if options["debugger"] != req.earlyoptions["debugger"]:
900 raise error.Abort(_("option --debugger may not be abbreviated!"))
901 # don't validate --profile/--traceback, which can be enabled from now
823 902
824 903 if options["encoding"]:
825 904 encoding.encoding = options["encoding"]
@@ -908,7 +987,7 b' def _dispatch(req):'
908 987 except error.RequirementError:
909 988 raise
910 989 except error.RepoError:
911 if rpath and rpath[-1]: # invalid -R path
990 if rpath: # invalid -R path
912 991 raise
913 992 if not func.optionalrepo:
914 993 if func.inferrepo and args and not path:
@@ -1848,58 +1848,8 b' class localrepository(object):'
1848 1848 status.modified.extend(status.clean) # mq may commit clean files
1849 1849
1850 1850 # check subrepos
1851 subs = []
1852 commitsubs = set()
1853 newstate = wctx.substate.copy()
1854 # only manage subrepos and .hgsubstate if .hgsub is present
1855 if '.hgsub' in wctx:
1856 # we'll decide whether to track this ourselves, thanks
1857 for c in status.modified, status.added, status.removed:
1858 if '.hgsubstate' in c:
1859 c.remove('.hgsubstate')
1860
1861 # compare current state to last committed state
1862 # build new substate based on last committed state
1863 oldstate = wctx.p1().substate
1864 for s in sorted(newstate.keys()):
1865 if not match(s):
1866 # ignore working copy, use old state if present
1867 if s in oldstate:
1868 newstate[s] = oldstate[s]
1869 continue
1870 if not force:
1871 raise error.Abort(
1872 _("commit with new subrepo %s excluded") % s)
1873 dirtyreason = wctx.sub(s).dirtyreason(True)
1874 if dirtyreason:
1875 if not self.ui.configbool('ui', 'commitsubrepos'):
1876 raise error.Abort(dirtyreason,
1877 hint=_("use --subrepos for recursive commit"))
1878 subs.append(s)
1879 commitsubs.add(s)
1880 else:
1881 bs = wctx.sub(s).basestate()
1882 newstate[s] = (newstate[s][0], bs, newstate[s][2])
1883 if oldstate.get(s, (None, None, None))[1] != bs:
1884 subs.append(s)
1885
1886 # check for removed subrepos
1887 for p in wctx.parents():
1888 r = [s for s in p.substate if s not in newstate]
1889 subs += [s for s in r if match(s)]
1890 if subs:
1891 if (not match('.hgsub') and
1892 '.hgsub' in (wctx.modified() + wctx.added())):
1893 raise error.Abort(
1894 _("can't commit subrepos without .hgsub"))
1895 status.modified.insert(0, '.hgsubstate')
1896
1897 elif '.hgsub' in status.removed:
1898 # clean up .hgsubstate when .hgsub is removed
1899 if ('.hgsubstate' in wctx and
1900 '.hgsubstate' not in (status.modified + status.added +
1901 status.removed)):
1902 status.removed.insert(0, '.hgsubstate')
1851 subs, commitsubs, newstate = subrepo.precommit(
1852 self.ui, wctx, status, match, force=force)
1903 1853
1904 1854 # make sure all explicit patterns are matched
1905 1855 if not force:
@@ -1233,9 +1233,17 b' def registersummarycallback(repo, otr, t'
1233 1233
1234 1234 def reportsummary(func):
1235 1235 """decorator for report callbacks."""
1236 reporef = weakref.ref(repo)
1236 # The repoview life cycle is shorter than the one of the actual
1237 # underlying repository. So the filtered object can die before the
1238 # weakref is used leading to troubles. We keep a reference to the
1239 # unfiltered object and restore the filtering when retrieving the
1240 # repository through the weakref.
1241 filtername = repo.filtername
1242 reporef = weakref.ref(repo.unfiltered())
1237 1243 def wrapped(tr):
1238 1244 repo = reporef()
1245 if filtername:
1246 repo = repo.filtered(filtername)
1239 1247 func(repo, tr)
1240 1248 newcat = '%2i-txnreport' % len(categories)
1241 1249 otr.addpostclose(newcat, wrapped)
@@ -293,6 +293,71 b' def submerge(repo, wctx, mctx, actx, ove'
293 293 writestate(repo, sm)
294 294 return sm
295 295
296 def precommit(ui, wctx, status, match, force=False):
297 """Calculate .hgsubstate changes that should be applied before committing
298
299 Returns (subs, commitsubs, newstate) where
300 - subs: changed subrepos (including dirty ones)
301 - commitsubs: dirty subrepos which the caller needs to commit recursively
302 - newstate: new state dict which the caller must write to .hgsubstate
303
304 This also updates the given status argument.
305 """
306 subs = []
307 commitsubs = set()
308 newstate = wctx.substate.copy()
309
310 # only manage subrepos and .hgsubstate if .hgsub is present
311 if '.hgsub' in wctx:
312 # we'll decide whether to track this ourselves, thanks
313 for c in status.modified, status.added, status.removed:
314 if '.hgsubstate' in c:
315 c.remove('.hgsubstate')
316
317 # compare current state to last committed state
318 # build new substate based on last committed state
319 oldstate = wctx.p1().substate
320 for s in sorted(newstate.keys()):
321 if not match(s):
322 # ignore working copy, use old state if present
323 if s in oldstate:
324 newstate[s] = oldstate[s]
325 continue
326 if not force:
327 raise error.Abort(
328 _("commit with new subrepo %s excluded") % s)
329 dirtyreason = wctx.sub(s).dirtyreason(True)
330 if dirtyreason:
331 if not ui.configbool('ui', 'commitsubrepos'):
332 raise error.Abort(dirtyreason,
333 hint=_("use --subrepos for recursive commit"))
334 subs.append(s)
335 commitsubs.add(s)
336 else:
337 bs = wctx.sub(s).basestate()
338 newstate[s] = (newstate[s][0], bs, newstate[s][2])
339 if oldstate.get(s, (None, None, None))[1] != bs:
340 subs.append(s)
341
342 # check for removed subrepos
343 for p in wctx.parents():
344 r = [s for s in p.substate if s not in newstate]
345 subs += [s for s in r if match(s)]
346 if subs:
347 if (not match('.hgsub') and
348 '.hgsub' in (wctx.modified() + wctx.added())):
349 raise error.Abort(_("can't commit subrepos without .hgsub"))
350 status.modified.insert(0, '.hgsubstate')
351
352 elif '.hgsub' in status.removed:
353 # clean up .hgsubstate when .hgsub is removed
354 if ('.hgsubstate' in wctx and
355 '.hgsubstate' not in (status.modified + status.added +
356 status.removed)):
357 status.removed.insert(0, '.hgsubstate')
358
359 return subs, commitsubs, newstate
360
296 361 def _updateprompt(ui, sub, dirty, local, remote):
297 362 if dirty:
298 363 msg = (_(' subrepository sources for %s differ\n'
@@ -235,3 +235,97 b' Amend a merge changeset'
235 235 |
236 236 o A
237 237
238
239 More complete test for status changes (issue5732)
240 -------------------------------------------------
241
242 Generates history of files having 3 states, r0_r1_wc:
243
244 r0: ground (content/missing)
245 r1: old state to be amended (content/missing, where missing means removed)
246 wc: changes to be included in r1 (content/missing-tracked/untracked)
247
248 $ hg init $TESTTMP/wcstates
249 $ cd $TESTTMP/wcstates
250
251 $ $PYTHON $TESTDIR/generate-working-copy-states.py state 2 1
252 $ hg addremove -q --similarity 0
253 $ hg commit -m0
254
255 $ $PYTHON $TESTDIR/generate-working-copy-states.py state 2 2
256 $ hg addremove -q --similarity 0
257 $ hg commit -m1
258
259 $ $PYTHON $TESTDIR/generate-working-copy-states.py state 2 wc
260 $ hg addremove -q --similarity 0
261 $ hg forget *_*_*-untracked
262 $ rm *_*_missing-*
263
264 amend r1 to include wc changes
265
266 $ hg amend
267 saved backup bundle to * (glob) (obsstore-off !)
268
269 clean/modified/removed/added states of the amended revision
270
271 $ hg status --all --change . 'glob:content1_*_content1-tracked'
272 C content1_content1_content1-tracked
273 C content1_content2_content1-tracked
274 C content1_missing_content1-tracked
275 $ hg status --all --change . 'glob:content1_*_content[23]-tracked'
276 M content1_content1_content3-tracked
277 M content1_content2_content2-tracked
278 M content1_content2_content3-tracked
279 M content1_missing_content3-tracked
280 $ hg status --all --change . 'glob:content1_*_missing-tracked'
281 M content1_content2_missing-tracked
282 R content1_missing_missing-tracked
283 C content1_content1_missing-tracked
284 $ hg status --all --change . 'glob:content1_*_*-untracked'
285 R content1_content1_content1-untracked
286 R content1_content1_content3-untracked
287 R content1_content1_missing-untracked
288 R content1_content2_content1-untracked
289 R content1_content2_content2-untracked
290 R content1_content2_content3-untracked
291 R content1_content2_missing-untracked
292 R content1_missing_content1-untracked
293 R content1_missing_content3-untracked
294 R content1_missing_missing-untracked
295 $ hg status --all --change . 'glob:missing_content2_*'
296 A missing_content2_content2-tracked
297 A missing_content2_content3-tracked
298 A missing_content2_missing-tracked
299 $ hg status --all --change . 'glob:missing_missing_*'
300 A missing_missing_content3-tracked
301
302 working directory should be all clean (with some missing/untracked files)
303
304 $ hg status --all 'glob:*_content?-tracked'
305 C content1_content1_content1-tracked
306 C content1_content1_content3-tracked
307 C content1_content2_content1-tracked
308 C content1_content2_content2-tracked
309 C content1_content2_content3-tracked
310 C content1_missing_content1-tracked
311 C content1_missing_content3-tracked
312 C missing_content2_content2-tracked
313 C missing_content2_content3-tracked
314 C missing_missing_content3-tracked
315 $ hg status --all 'glob:*_missing-tracked'
316 ! content1_content1_missing-tracked
317 ! content1_content2_missing-tracked
318 ! content1_missing_missing-tracked
319 ! missing_content2_missing-tracked
320 ! missing_missing_missing-tracked
321 $ hg status --all 'glob:*-untracked'
322 ? content1_content1_content1-untracked
323 ? content1_content1_content3-untracked
324 ? content1_content2_content1-untracked
325 ? content1_content2_content2-untracked
326 ? content1_content2_content3-untracked
327 ? content1_missing_content1-untracked
328 ? content1_missing_content3-untracked
329 ? missing_content2_content2-untracked
330 ? missing_content2_content3-untracked
331 ? missing_missing_content3-untracked
@@ -19,7 +19,7 b' command, exit codes, and duration'
19 19 1970/01/01 00:00:00 bob @0000000000000000000000000000000000000000 (5000)> init blackboxtest exited 0 after * seconds (glob)
20 20 1970/01/01 00:00:00 bob @0000000000000000000000000000000000000000 (5000)> add a
21 21 1970/01/01 00:00:00 bob @0000000000000000000000000000000000000000 (5000)> add a exited 0 after * seconds (glob)
22 1970/01/01 00:00:00 bob @0000000000000000000000000000000000000000+ (5000)> blackbox
22 1970/01/01 00:00:00 bob @0000000000000000000000000000000000000000+ (5000)> blackbox --config *blackbox.dirty=True* (glob)
23 23
24 24 alias expansion is logged
25 25 $ rm ./.hg/blackbox.log
@@ -261,7 +261,7 b' divergent bookmarks'
261 261 Z 1:0d2164f0ce0d
262 262
263 263 $ cd ../b
264 $ hg up --config
264 $ hg up
265 265 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
266 266 updating bookmark foobar
267 267 $ echo c2 > f2
@@ -30,6 +30,89 b' Missing arg:'
30 30 (use 'hg cat -h' to show more help)
31 31 [255]
32 32
33 Missing parameter for early option:
34
35 $ hg log -R 2>&1 | grep 'hg log'
36 hg log: option -R requires argument
37 hg log [OPTION]... [FILE]
38 (use 'hg log -h' to show more help)
39
40 $ hg log -R -- 2>&1 | grep 'hg log'
41 hg log: option -R requires argument
42 hg log [OPTION]... [FILE]
43 (use 'hg log -h' to show more help)
44
45 Parsing of early options should stop at "--":
46
47 $ hg cat -- --config=hooks.pre-cat=false
48 --config=hooks.pre-cat=false: no such file in rev cb9a9f314b8b
49 [1]
50 $ hg cat -- --debugger
51 --debugger: no such file in rev cb9a9f314b8b
52 [1]
53
54 Unparsable form of early options:
55
56 $ hg cat --debugg
57 abort: option --debugger may not be abbreviated!
58 [255]
59
60 Parsing failure of early options should be detected before executing the
61 command:
62
63 $ hg log -b '--config=hooks.pre-log=false' default
64 abort: option --config may not be abbreviated!
65 [255]
66 $ hg log -b -R. default
67 abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
68 [255]
69 $ hg log --cwd .. -b --cwd=. default
70 abort: option --cwd may not be abbreviated!
71 [255]
72
73 However, we can't prevent it from loading extensions and configs:
74
75 $ cat <<EOF > bad.py
76 > raise Exception('bad')
77 > EOF
78 $ hg log -b '--config=extensions.bad=bad.py' default
79 *** failed to import extension bad from bad.py: bad
80 abort: option --config may not be abbreviated!
81 [255]
82
83 $ mkdir -p badrepo/.hg
84 $ echo 'invalid-syntax' > badrepo/.hg/hgrc
85 $ hg log -b -Rbadrepo default
86 hg: parse error at badrepo/.hg/hgrc:1: invalid-syntax
87 [255]
88
89 $ hg log -b --cwd=inexistent default
90 abort: No such file or directory: 'inexistent'
91 [255]
92
93 $ hg log -b '--config=ui.traceback=yes' 2>&1 | grep '^Traceback'
94 Traceback (most recent call last):
95 $ hg log -b '--config=profiling.enabled=yes' 2>&1 | grep -i sample
96 Sample count: .*|No samples recorded\. (re)
97
98 Early options can't be specified in [aliases] and [defaults] because they are
99 applied before the command name is resolved:
100
101 $ hg log -b '--config=alias.log=log --config=hooks.pre-log=false'
102 hg log: option -b not recognized
103 error in definition for alias 'log': --config may only be given on the command
104 line
105 [255]
106
107 $ hg log -b '--config=defaults.log=--config=hooks.pre-log=false'
108 abort: option --config may not be abbreviated!
109 [255]
110
111 Shell aliases bypass any command parsing rules but for the early one:
112
113 $ hg log -b '--config=alias.log=!echo howdy'
114 howdy
115
33 116 [defaults]
34 117
35 118 $ hg cat a
@@ -233,9 +233,10 b' add another largefile to the new largefi'
233 233 $ cd ..
234 234
235 235 round-trip: converting back to a normal (non-largefiles) repo with
236 "lfconvert --to-normal" should give the same as ../bigfile-repo
236 "lfconvert --to-normal" should give the same as ../bigfile-repo. The
237 convert extension is disabled to show config items can be loaded without it.
237 238 $ cd largefiles-repo
238 $ hg lfconvert --to-normal . ../normal-repo
239 $ hg --config extensions.convert=! lfconvert --to-normal . ../normal-repo
239 240 initializing destination ../normal-repo
240 241 0 additional largefiles cached
241 242 scanning source...
@@ -61,7 +61,7 b' A deleted subrepo file is flagged as dir'
61 61 9bfe45a197d7+ tip
62 62 $ cat .hg/blackbox.log
63 63 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> serve --cmdserver chgunix * (glob) (chg !)
64 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id (glob)
64 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id --config *extensions.blackbox=* --config *blackbox.dirty=True* (glob)
65 65 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id --config *extensions.blackbox=* --config *blackbox.dirty=True* exited 0 * (glob)
66 66
67 67 TODO: a deleted file should be listed as such, like the top level repo
@@ -17,7 +17,7 b' Function to test discovery between two r'
17 17 > hg -R a debugdiscovery b --verbose --debug --config progress.debug=true
18 18 > echo
19 19 > echo "% -- b -> a tree"
20 > hg -R b debugdiscovery a --verbose --old --config
20 > hg -R b debugdiscovery a --verbose --old
21 21 > echo
22 22 > echo "% -- b -> a set"
23 23 > hg -R b debugdiscovery a --verbose --debug --config progress.debug=true
@@ -406,8 +406,8 b' fixed in 86c35b7ae300:'
406 406 101 102 103 104 105 106 107 108 109 110 (no-eol)
407 407 $ hg -R r1 --config extensions.blackbox= blackbox
408 408 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> serve --cmdserver chgunix * (glob) (chg !)
409 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> outgoing r2 *-T{rev} * (glob)
409 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* (glob)
410 410 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> found 101 common and 1 unknown server heads, 2 roundtrips in *.????s (glob)
411 411 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* exited 0 after *.?? seconds (glob)
412 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> blackbox (glob)
412 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 --config *extensions.blackbox=* blackbox (glob)
413 413 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now