--- a/.hgsigs Sat Feb 28 01:12:54 2015 -0500
+++ b/.hgsigs Mon Mar 02 01:20:14 2015 -0600
@@ -102,3 +102,4 @@
1265a3a71d75396f5d4cf6935ae7d9ba5407a547 0 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
--- a/.hgtags Sat Feb 28 01:12:54 2015 -0500
+++ b/.hgtags Mon Mar 02 01:20:14 2015 -0600
@@ -115,3 +115,4 @@
1265a3a71d75396f5d4cf6935ae7d9ba5407a547 3.2.4
db8e3f7948b1fdeb9ad12d448fc3525759908b9f 3.3-rc
fbdd5195528fae4f41feebc1838215c110b25d6a 3.3
+5b4ed033390bf6e2879c8f5c28c84e1ee3b87231 3.3.1
--- a/hgext/largefiles/lfutil.py Sat Feb 28 01:12:54 2015 -0500
+++ b/hgext/largefiles/lfutil.py Mon Mar 02 01:20:14 2015 -0600
@@ -577,7 +577,7 @@
Otherwise, this returns the function to always write out (or
ignore if ``not forcibly``) status.
'''
- if forcibly is None:
+ if forcibly is None and util.safehasattr(repo, '_largefilesenabled'):
return repo._lfstatuswriters[-1]
else:
if forcibly:
--- a/hgext/largefiles/overrides.py Sat Feb 28 01:12:54 2015 -0500
+++ b/hgext/largefiles/overrides.py Mon Mar 02 01:20:14 2015 -0600
@@ -848,6 +848,9 @@
return result
def overriderebase(orig, ui, repo, **opts):
+ if not util.safehasattr(repo, '_largefilesenabled'):
+ return orig(ui, repo, **opts)
+
resuming = opts.get('continue')
repo._lfcommithooks.append(lfutil.automatedcommithook(resuming))
repo._lfstatuswriters.append(lambda *msg, **opts: None)
--- a/hgext/largefiles/reposetup.py Sat Feb 28 01:12:54 2015 -0500
+++ b/hgext/largefiles/reposetup.py Mon Mar 02 01:20:14 2015 -0600
@@ -24,6 +24,9 @@
return
class lfilesrepo(repo.__class__):
+ # the mark to examine whether "repo" object enables largefiles or not
+ _largefilesenabled = True
+
lfstatus = False
def status_nolfiles(self, *args, **kwargs):
return super(lfilesrepo, self).status(*args, **kwargs)
--- a/i18n/ja.po Sat Feb 28 01:12:54 2015 -0500
+++ b/i18n/ja.po Mon Mar 02 01:20:14 2015 -0600
@@ -149,8 +149,8 @@
msgstr ""
"Project-Id-Version: Mercurial\n"
"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2015-01-31 23:43+0900\n"
-"PO-Revision-Date: 2015-02-01 08:15+0900\n"
+"POT-Creation-Date: 2015-02-28 17:53+0900\n"
+"PO-Revision-Date: 2015-03-01 01:23+0900\n"
"Last-Translator: Japanese translation team <mercurial-ja@googlegroups.com>\n"
"Language-Team: Japanese\n"
"Language: ja\n"
@@ -24938,13 +24938,13 @@
msgid "parsing obsolete marker: unknown version %r"
msgstr "廃止情報解析: 未知のリビジョン %r"
+msgid "bad obsolescence marker detected: invalid successors nullid"
+msgstr "不正な廃止情報を検出: 後継としての null 指定は不正です"
+
#, python-format
msgid "in-marker cycle with %s"
msgstr "マーカ %s における循環参照があります"
-msgid "bad obsolescence marker detected: invalid successors nullid"
-msgstr "不正な廃止情報を検出: 後継としての null 指定は不正です"
-
#, python-format
msgid "unknown key: %r"
msgstr "未知のキーです: %r"
@@ -25559,6 +25559,9 @@
"we'll\n"
" work around it to return a non-filtered value."
msgstr ""
+" 不可視なリビジョンが該当する場合は、 別な可視リビジョンが無いか、\n"
+" ある程度の事後処理が実施されます (※ 訳注: 代替リビジョンの返却は、\n"
+" 未保証です)"
#. i18n: "filelog" is a keyword
msgid "filelog requires a pattern"
@@ -26990,6 +26993,9 @@
msgid ":subrepos: List of strings. Updated subrepositories in the changeset."
msgstr ":subrepos: 文字列挙。 当該リビジョンで更新されたサブリポジトリ名。"
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ":tags: 文字列列挙。 当該リビジョンに付与されたタグの一覧。"
+
msgid ""
":parents: List of strings. The parents of the changeset in \"rev:node\"\n"
" format. If the changeset has only one \"natural\" parent (the "
@@ -27591,6 +27597,3 @@
msgid "number of cpus must be an integer"
msgstr "CPU 数には数値を指定してください"
-
-msgid ":tags: List of strings. Any tags associated with the changeset."
-msgstr ":tags: 文字列列挙。 当該リビジョンに付与されたタグの一覧。"
--- a/i18n/pt_BR.po Sat Feb 28 01:12:54 2015 -0500
+++ b/i18n/pt_BR.po Mon Mar 02 01:20:14 2015 -0600
@@ -25509,14 +25509,14 @@
msgid "parsing obsolete marker: unknown version %r"
msgstr "decodificando marcações de obsolescência: versão desconhecida %r"
+msgid "bad obsolescence marker detected: invalid successors nullid"
+msgstr ""
+"marcação de obsolescência inválida detectada: sucessores nullid inválidos"
+
#, python-format
msgid "in-marker cycle with %s"
msgstr "ciclo nos marcadores com %s"
-msgid "bad obsolescence marker detected: invalid successors nullid"
-msgstr ""
-"marcação de obsolescência inválida detectada: sucessores nullid inválidos"
-
#, python-format
msgid "unknown key: %r"
msgstr "chave desconhecida: %r"
@@ -25690,8 +25690,9 @@
msgstr "morto pelo sinal %d"
#, python-format
-msgid "unknown strip-bundle2-version value %r; "
-msgstr "valor desconhecido de strip-bundle2-version %r; "
+msgid "unknown strip-bundle2-version value %r; should be one of %r\n"
+msgstr ""
+"valor desconhecido de strip-bundle2-version %r; deveria ser um dentre %r\n"
#, python-format
msgid "saved backup bundle to %s\n"
@@ -27610,6 +27611,9 @@
msgid ":subrepos: List of strings. Updated subrepositories in the changeset."
msgstr ":subrepos: Lista de strings. Sub-repositórios atualizados na revisão."
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ":tags: Lista de strings. Quaisquer etiquetas associadas à revisão."
+
msgid ""
":parents: List of strings. The parents of the changeset in \"rev:node\"\n"
" format. If the changeset has only one \"natural\" parent (the predecessor\n"
@@ -28249,6 +28253,3 @@
#~ msgid "graft for revision %s is empty\n"
#~ msgstr "o enxerto para a revisão %s é vazio\n"
-
-#~ msgid ":tags: List of strings. Any tags associated with the changeset."
-#~ msgstr ":tags: Lista de strings. Quaisquer etiquetas associadas à revisão."
--- a/mercurial/branchmap.py Sat Feb 28 01:12:54 2015 -0500
+++ b/mercurial/branchmap.py Mon Mar 02 01:20:14 2015 -0600
@@ -330,7 +330,7 @@
and will grow with it but be 1/8th of its size.
"""
- def __init__(self, repo):
+ def __init__(self, repo, readonly=True):
assert repo.filtername is None
self._names = [] # branch names in local encoding with static index
self._rbcrevs = array('c') # structs of type _rbcrecfmt
@@ -342,6 +342,10 @@
except (IOError, OSError), inst:
repo.ui.debug("couldn't read revision branch cache names: %s\n" %
inst)
+ if readonly:
+ # don't try to use cache - fall back to the slow path
+ self.branchinfo = self._branchinfo
+
if self._names:
try:
data = repo.vfs.read(_rbcrevs)
--- a/mercurial/dispatch.py Sat Feb 28 01:12:54 2015 -0500
+++ b/mercurial/dispatch.py Mon Mar 02 01:20:14 2015 -0600
@@ -227,6 +227,9 @@
except (AttributeError, IndexError):
# it might be anything, for example a string
reason = inst.reason
+ if isinstance(reason, unicode):
+ # SSLError of Python 2.7.9 contains a unicode
+ reason = reason.encode(encoding.encoding, 'replace')
ui.warn(_("abort: error: %s\n") % reason)
elif (util.safehasattr(inst, "args")
and inst.args and inst.args[0] == errno.EPIPE):
--- a/mercurial/namespaces.py Sat Feb 28 01:12:54 2015 -0500
+++ b/mercurial/namespaces.py Mon Mar 02 01:20:14 2015 -0600
@@ -41,7 +41,8 @@
# i18n: column positioning for "hg log"
logfmt=_("tag: %s\n"),
listnames=tagnames,
- namemap=tagnamemap, nodemap=tagnodemap)
+ namemap=tagnamemap, nodemap=tagnodemap,
+ deprecated=set(['tip']))
self.addnamespace(n)
bnames = lambda repo: repo.branchmap().keys()
@@ -126,11 +127,13 @@
dictionary)
'namemap': function that takes a name and returns a list of nodes
'nodemap': function that takes a node and returns a list of names
+ 'deprecated': set of names to be masked for ordinary use
"""
def __init__(self, name, templatename=None, logname=None, colorname=None,
- logfmt=None, listnames=None, namemap=None, nodemap=None):
+ logfmt=None, listnames=None, namemap=None, nodemap=None,
+ deprecated=None):
"""create a namespace
name: the namespace to be registered (in plural form)
@@ -144,6 +147,7 @@
listnames: function to list all names
namemap: function that inputs a node, output name(s)
nodemap: function that inputs a name, output node(s)
+ deprecated: set of names to be masked for ordinary use
"""
self.name = name
@@ -168,6 +172,11 @@
# i18n: column positioning for "hg log"
self.logfmt = ("%s:" % self.logname).ljust(13) + "%s\n"
+ if deprecated is None:
+ self.deprecated = set()
+ else:
+ self.deprecated = deprecated
+
def names(self, repo, node):
"""method that returns a (sorted) list of names in a namespace that
match a given node"""
--- a/mercurial/repoview.py Sat Feb 28 01:12:54 2015 -0500
+++ b/mercurial/repoview.py Mon Mar 02 01:20:14 2015 -0600
@@ -274,7 +274,8 @@
unfichangelog = unfi.changelog
revs = filterrevs(unfi, self.filtername)
cl = self._clcache
- newkey = (len(unfichangelog), unfichangelog.tip(), hash(revs))
+ newkey = (len(unfichangelog), unfichangelog.tip(), hash(revs),
+ unfichangelog._delayed)
if cl is not None:
# we need to check curkey too for some obscure reason.
# MQ test show a corruption of the underlying repo (in _clcache)
@@ -282,7 +283,7 @@
oldfilter = cl.filteredrevs
try:
cl.filteredrevs = () # disable filtering for tip
- curkey = (len(cl), cl.tip(), hash(oldfilter))
+ curkey = (len(cl), cl.tip(), hash(oldfilter), cl._delayed)
finally:
cl.filteredrevs = oldfilter
if newkey != self._clcachekey or newkey != curkey:
--- a/mercurial/revset.py Sat Feb 28 01:12:54 2015 -0500
+++ b/mercurial/revset.py Mon Mar 02 01:20:14 2015 -0600
@@ -527,7 +527,7 @@
import branchmap
urepo = repo.unfiltered()
ucl = urepo.changelog
- getbi = branchmap.revbranchcache(urepo).branchinfo
+ getbi = branchmap.revbranchcache(urepo, readonly=True).branchinfo
try:
b = getstring(x, '')
@@ -1277,7 +1277,8 @@
names = set()
for ns in namespaces:
for name in ns.listnames(repo):
- names.update(repo[n].rev() for n in ns.nodes(repo, name))
+ if name not in ns.deprecated:
+ names.update(repo[n].rev() for n in ns.nodes(repo, name))
names -= set([node.nullrev])
return subset & names
--- a/mercurial/templatekw.py Sat Feb 28 01:12:54 2015 -0500
+++ b/mercurial/templatekw.py Mon Mar 02 01:20:14 2015 -0600
@@ -199,10 +199,10 @@
"""
repo = args['ctx']._repo
bookmarks = args['ctx'].bookmarks()
- hybrid = showlist('bookmark', bookmarks, **args)
- for value in hybrid.values:
- value['current'] = repo._bookmarkcurrent
- return hybrid
+ current = repo._bookmarkcurrent
+ c = [{'bookmark': x, 'current': current} for x in bookmarks]
+ f = _showlist('bookmark', bookmarks, **args)
+ return _hybrid(f, c, lambda x: x['bookmark'])
def showchildren(**args):
""":children: List of strings. The children of the changeset."""
--- a/mercurial/util.py Sat Feb 28 01:12:54 2015 -0500
+++ b/mercurial/util.py Mon Mar 02 01:20:14 2015 -0600
@@ -720,7 +720,9 @@
"copy a file, preserving mode and atime/mtime"
if os.path.lexists(dest):
unlink(dest)
- if hardlink:
+ # hardlinks are problematic on CIFS, quietly ignore this flag
+ # until we find a way to work around it cleanly (issue4546)
+ if False or hardlink:
try:
oslink(src, dest)
return
--- a/tests/test-command-template.t Sat Feb 28 01:12:54 2015 -0500
+++ b/tests/test-command-template.t Mon Mar 02 01:20:14 2015 -0600
@@ -2381,6 +2381,11 @@
2
1
0
+ $ hg book -r1 baz
+ $ hg log --template "{rev} {join(bookmarks, ' ')}\n"
+ 2 bar foo
+ 1 baz
+ 0
Test stringify on sub expressions
--- a/tests/test-extdiff.t Sat Feb 28 01:12:54 2015 -0500
+++ b/tests/test-extdiff.t Mon Mar 02 01:20:14 2015 -0600
@@ -179,7 +179,7 @@
TODO
#else
$ hg --debug odd | grep '^running'
- running "*/bin/echo --foo='sp ace' 'sp ace' --bar='sp ace' 'sp ace'" in * (glob)
+ running "*/echo --foo='sp ace' 'sp ace' --bar='sp ace' 'sp ace'" in * (glob)
#endif
Empty argument must be quoted
--- a/tests/test-largefiles-misc.t Sat Feb 28 01:12:54 2015 -0500
+++ b/tests/test-largefiles-misc.t Mon Mar 02 01:20:14 2015 -0600
@@ -915,6 +915,77 @@
$ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
#endif
+Test overridden functions work correctly even for repos disabling
+largefiles (issue4547)
+
+ $ hg showconfig extensions | grep largefiles
+ extensions.largefiles=!
+
+(test updating implied by clone)
+
+ $ hg init enabled-but-no-largefiles
+ $ echo normal1 > enabled-but-no-largefiles/normal1
+ $ hg -R enabled-but-no-largefiles add enabled-but-no-largefiles/normal1
+ $ hg -R enabled-but-no-largefiles commit -m '#0@enabled-but-no-largefiles'
+ Invoking status precommit hook
+ A normal1
+ $ cat >> enabled-but-no-largefiles/.hg/hgrc <<EOF
+ > [extensions]
+ > # enable locally
+ > largefiles=
+ > EOF
+ $ hg clone -q enabled-but-no-largefiles no-largefiles
+
+(test rebasing implied by pull: precommit while rebasing unexpectedly
+shows "normal3" as "?", because lfdirstate isn't yet written out at
+that time)
+
+ $ echo normal2 > enabled-but-no-largefiles/normal2
+ $ hg -R enabled-but-no-largefiles add enabled-but-no-largefiles/normal2
+ $ hg -R enabled-but-no-largefiles commit -m '#1@enabled-but-no-largefiles'
+ Invoking status precommit hook
+ A normal2
+
+ $ echo normal3 > no-largefiles/normal3
+ $ hg -R no-largefiles add no-largefiles/normal3
+ $ hg -R no-largefiles commit -m '#1@no-largefiles'
+ Invoking status precommit hook
+ A normal3
+
+ $ hg -R no-largefiles -q pull --rebase
+ Invoking status precommit hook
+ ? normal3
+
+(test reverting)
+
+ $ hg init subrepo-root
+ $ cat >> subrepo-root/.hg/hgrc <<EOF
+ > [extensions]
+ > # enable locally
+ > largefiles=
+ > EOF
+ $ echo large > subrepo-root/large
+ $ hg -R subrepo-root add --large subrepo-root/large
+ $ hg clone -q no-largefiles subrepo-root/no-largefiles
+ $ cat > subrepo-root/.hgsub <<EOF
+ > no-largefiles = no-largefiles
+ > EOF
+ $ hg -R subrepo-root add subrepo-root/.hgsub
+ $ hg -R subrepo-root commit -m '#0'
+ Invoking status precommit hook
+ A .hgsub
+ A large
+ ? .hgsubstate
+ $ echo dirty >> subrepo-root/large
+ $ echo dirty >> subrepo-root/no-largefiles/normal1
+ $ hg -R subrepo-root status -S
+ M large
+ M no-largefiles/normal1
+ $ hg -R subrepo-root revert --all
+ reverting subrepo-root/.hglf/large (glob)
+ reverting subrepo no-largefiles
+ reverting subrepo-root/no-largefiles/normal1 (glob)
+
$ cd ..
--- a/tests/test-revset.t Sat Feb 28 01:12:54 2015 -0500
+++ b/tests/test-revset.t Mon Mar 02 01:20:14 2015 -0600
@@ -791,7 +791,6 @@
6
$ log 'named("tags")'
6
- 9
issue2437