--- a/.hgsigs Mon Mar 11 15:37:28 2013 -0700
+++ b/.hgsigs Tue Mar 19 16:19:20 2013 -0700
@@ -66,3 +66,4 @@
f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 0 iD8DBQBQ+yuYywK+sNU5EO8RAm9JAJoD/UciWvpGeKBcpGtZJBFJVcL/HACghDXSgQ+xQDjB+6uGrdgAQsRR1Lg=
a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 0 iD8DBQBRDDROywK+sNU5EO8RAh75AJ9uJCGoCWnP0Lv/+XuYs4hvUl+sAgCcD36QgAnuw8IQXrvv684BAXAnHcA=
7511d4df752e61fe7ae4f3682e0a0008573b0402 0 iD8DBQBRFYaoywK+sNU5EO8RAuErAJoDyhXn+lptU3+AevVdwAIeNFyR2gCdHzPHyWd+JDeWCUR+pSOBi8O2ppM=
+5b7175377babacce80a6c1e12366d8032a6d4340 0 iD8DBQBRMCYgywK+sNU5EO8RAq1/AKCWKlt9ysibyQgYwoxxIOZv5J8rpwCcDSHQaaf1fFZUTnQsOePwcM2Y/Sg=
--- a/.hgtags Mon Mar 11 15:37:28 2013 -0700
+++ b/.hgtags Tue Mar 19 16:19:20 2013 -0700
@@ -79,3 +79,4 @@
f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 2.5-rc
a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 2.5
7511d4df752e61fe7ae4f3682e0a0008573b0402 2.5.1
+5b7175377babacce80a6c1e12366d8032a6d4340 2.5.2
--- a/contrib/mergetools.hgrc Mon Mar 11 15:37:28 2013 -0700
+++ b/contrib/mergetools.hgrc Tue Mar 19 16:19:20 2013 -0700
@@ -15,7 +15,7 @@
gvimdiff.regname=path
gvimdiff.priority=-9
-vimdiff.args=$local $other $base
+vimdiff.args=$local $other $base -c 'redraw | echomsg "hg merge conflict, type \":cq\" to abort vimdiff"'
vimdiff.check=changed
vimdiff.priority=-10
--- a/hgext/largefiles/basestore.py Mon Mar 11 15:37:28 2013 -0700
+++ b/hgext/largefiles/basestore.py Tue Mar 19 16:19:20 2013 -0700
@@ -59,6 +59,8 @@
missing = []
ui = self.ui
+ util.makedirs(lfutil.storepath(self.repo, ''))
+
at = 0
for filename, hash in files:
ui.progress(_('getting largefiles'), at, unit='lfile',
--- a/hgext/largefiles/lfcommands.py Mon Mar 11 15:37:28 2013 -0700
+++ b/hgext/largefiles/lfcommands.py Tue Mar 19 16:19:20 2013 -0700
@@ -8,7 +8,7 @@
'''High-level command function for lfconvert, plus the cmdtable.'''
-import os
+import os, errno
import shutil
from mercurial import util, match as match_, hg, node, context, error, \
@@ -403,22 +403,13 @@
toget = []
for lfile in lfiles:
- # If we are mid-merge, then we have to trust the standin that is in the
- # working copy to have the correct hashvalue. This is because the
- # original hg.merge() already updated the standin as part of the normal
- # merge process -- we just have to update the largefile to match.
- if (getattr(repo, "_ismerging", False) and
- os.path.exists(repo.wjoin(lfutil.standin(lfile)))):
- expectedhash = lfutil.readstandin(repo, lfile)
- else:
+ try:
expectedhash = repo[node][lfutil.standin(lfile)].data().strip()
-
- # if it exists and its hash matches, it might have been locally
- # modified before updating and the user chose 'local'. in this case,
- # it will not be in any store, so don't look for it.
- if ((not os.path.exists(repo.wjoin(lfile)) or
- expectedhash != lfutil.hashfile(repo.wjoin(lfile))) and
- not lfutil.findfile(repo, expectedhash)):
+ except IOError, err:
+ if err.errno == errno.ENOENT:
+ continue # node must be None and standin wasn't found in wctx
+ raise
+ if not lfutil.findfile(repo, expectedhash):
toget.append((lfile, expectedhash))
if toget:
@@ -435,11 +426,12 @@
pass
totalsuccess = 0
totalmissing = 0
- for ctx in cmdutil.walkchangerevs(repo, matchfn, {'rev' : rev},
- prepare):
- success, missing = cachelfiles(ui, repo, ctx.node())
- totalsuccess += len(success)
- totalmissing += len(missing)
+ if rev != []: # walkchangerevs on empty list would return all revs
+ for ctx in cmdutil.walkchangerevs(repo, matchfn, {'rev' : rev},
+ prepare):
+ success, missing = cachelfiles(ui, repo, ctx.node())
+ totalsuccess += len(success)
+ totalmissing += len(missing)
ui.status(_("%d additional largefiles cached\n") % totalsuccess)
if totalmissing > 0:
ui.status(_("%d largefiles failed to download\n") % totalmissing)
@@ -458,7 +450,7 @@
if printmessage and lfiles:
ui.status(_('getting changed largefiles\n'))
printed = True
- cachelfiles(ui, repo, '.', lfiles)
+ cachelfiles(ui, repo, None, lfiles)
updated, removed = 0, 0
for f in lfiles:
@@ -500,6 +492,8 @@
# use normallookup() to allocate entry in largefiles dirstate,
# because lack of it misleads lfilesrepo.status() into
# recognition that such cache missing files are REMOVED.
+ if lfile not in repo[None]: # not switched to normal file
+ util.unlinkpath(abslfile, ignoremissing=True)
lfdirstate.normallookup(lfile)
return None # don't try to set the mode
else:
--- a/hgext/largefiles/lfutil.py Mon Mar 11 15:37:28 2013 -0700
+++ b/hgext/largefiles/lfutil.py Tue Mar 19 16:19:20 2013 -0700
@@ -225,13 +225,9 @@
standindir = repo.wjoin(shortname)
if pats:
pats = [os.path.join(standindir, pat) for pat in pats]
- elif os.path.isdir(standindir):
+ else:
# no patterns: relative to repo root
pats = [standindir]
- else:
- # no patterns and no standin dir: return matcher that matches nothing
- return match_.match(repo.root, None, [], exact=True)
-
# no warnings about missing files or directories
match = scmutil.match(repo[None], pats, opts)
match.bad = lambda f, msg: None
--- a/hgext/largefiles/overrides.py Mon Mar 11 15:37:28 2013 -0700
+++ b/hgext/largefiles/overrides.py Tue Mar 19 16:19:20 2013 -0700
@@ -684,15 +684,8 @@
return result
def hgmerge(orig, repo, node, force=None, remind=True):
- # Mark the repo as being in the middle of a merge, so that
- # updatelfiles() will know that it needs to trust the standins in
- # the working copy, not in the standins in the current node
- repo._ismerging = True
- try:
- result = orig(repo, node, force, remind)
- lfcommands.updatelfiles(repo.ui, repo)
- finally:
- repo._ismerging = False
+ result = orig(repo, node, force, remind)
+ lfcommands.updatelfiles(repo.ui, repo)
return result
# When we rebase a repository with remotely changed largefiles, we need to
@@ -746,7 +739,7 @@
if opts.get('all_largefiles'):
revspostpull = len(repo)
revs = []
- for rev in xrange(revsprepull + 1, revspostpull):
+ for rev in xrange(revsprepull, revspostpull):
revs.append(repo[rev].rev())
lfcommands.downloadlfiles(ui, repo, revs)
return result
--- a/hgext/largefiles/reposetup.py Mon Mar 11 15:37:28 2013 -0700
+++ b/hgext/largefiles/reposetup.py Tue Mar 19 16:19:20 2013 -0700
@@ -299,9 +299,9 @@
lfdirstate = lfutil.openlfdirstate(ui, self)
dirtymatch = match_.always(self.root, self.getcwd())
s = lfdirstate.status(dirtymatch, [], False, False, False)
- modifiedfiles = []
- for i in s:
- modifiedfiles.extend(i)
+ (unsure, modified, added, removed, _missing, _unknown,
+ _ignored, _clean) = s
+ modifiedfiles = unsure + modified + added + removed
lfiles = lfutil.listlfiles(self)
# this only loops through largefiles that exist (not
# removed/renamed)
--- a/mercurial/commands.py Mon Mar 11 15:37:28 2013 -0700
+++ b/mercurial/commands.py Tue Mar 19 16:19:20 2013 -0700
@@ -1066,7 +1066,7 @@
dest = ui.expandpath(dest or 'default-push', dest or 'default')
dest, branches = hg.parseurl(dest, opts.get('branch'))
other = hg.peer(repo, opts, dest)
- revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
+ revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
heads = revs and map(repo.lookup, revs) or revs
outgoing = discovery.findcommonoutgoing(repo, other,
onlyheads=heads,
--- a/mercurial/localrepo.py Mon Mar 11 15:37:28 2013 -0700
+++ b/mercurial/localrepo.py Tue Mar 19 16:19:20 2013 -0700
@@ -705,14 +705,18 @@
def setparents(self, p1, p2=nullid):
copies = self.dirstate.setparents(p1, p2)
+ pctx = self[p1]
if copies:
# Adjust copy records, the dirstate cannot do it, it
# requires access to parents manifests. Preserve them
# only for entries added to first parent.
- pctx = self[p1]
for f in copies:
if f not in pctx and copies[f] in pctx:
self.dirstate.copy(copies[f], f)
+ if p2 == nullid:
+ for f, s in sorted(self.dirstate.copies().items()):
+ if f not in pctx and s not in pctx:
+ self.dirstate.copy(None, f)
def filectx(self, path, changeid=None, fileid=None):
"""changeid can be a changeset revision, node, or tag.
--- a/mercurial/templatefilters.py Mon Mar 11 15:37:28 2013 -0700
+++ b/mercurial/templatefilters.py Tue Mar 19 16:19:20 2013 -0700
@@ -5,6 +5,7 @@
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
+from i18n import _
import cgi, re, os, time, urllib
import encoding, node, util, error
import hbisect
--- a/tests/test-bundle.t Mon Mar 11 15:37:28 2013 -0700
+++ b/tests/test-bundle.t Tue Mar 19 16:19:20 2013 -0700
@@ -522,6 +522,21 @@
[255]
$ cd ..
+test to bundle revisions on the newly created branch (issue3828):
+
+ $ hg -q clone -U test test-clone
+ $ cd test
+
+ $ hg -q branch foo
+ $ hg commit -m "create foo branch"
+ $ hg -q outgoing ../test-clone
+ 9:b4f5acb1ee27
+ $ hg -q bundle --branch foo foo.hg ../test-clone
+ $ hg -R foo.hg -q log -r "bundle()"
+ 9:b4f5acb1ee27
+
+ $ cd ..
+
test for http://mercurial.selenic.com/bts/issue1144
test that verify bundle does not traceback
--- a/tests/test-issue1175.t Mon Mar 11 15:37:28 2013 -0700
+++ b/tests/test-issue1175.t Tue Mar 19 16:19:20 2013 -0700
@@ -31,7 +31,7 @@
b
b: searching for copy revision for a
b: copy a:b80de5d138758541c5f05265ad144ab9fa86d1db
- committed changeset 5:89e8e4be0de296fa3d6dd7825ccc44d7dc0f1f3b
+ committed changeset 5:732aafbecb501a198b3cc9323ad3899ff04ccf95
$ hg verify
checking changesets
@@ -44,8 +44,8 @@
# HG changeset patch
# User test
# Date 0 0
- # Node ID 89e8e4be0de296fa3d6dd7825ccc44d7dc0f1f3b
- # Parent 7fc86ba705e717a721dbc361bf8c9bc05a18ca2f
+ # Node ID 732aafbecb501a198b3cc9323ad3899ff04ccf95
+ # Parent 1d1625283f71954f21d14c3d44d0ad3c019c597f
5
diff --git a/b b/b
--- a/tests/test-issue3084.t Mon Mar 11 15:37:28 2013 -0700
+++ b/tests/test-issue3084.t Tue Mar 19 16:19:20 2013 -0700
@@ -31,6 +31,8 @@
foo has been turned into a largefile
use (l)argefile or keep as (n)ormal file? 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
(branch merge, don't forget to commit)
+ getting changed largefiles
+ 0 largefiles updated, 0 removed
$ hg status
$ cat foo
--- a/tests/test-largefiles-cache.t Mon Mar 11 15:37:28 2013 -0700
+++ b/tests/test-largefiles-cache.t Tue Mar 19 16:19:20 2013 -0700
@@ -16,6 +16,9 @@
$ echo large > large
$ hg add --large large
$ hg commit -m 'add largefile'
+ $ hg rm large
+ $ hg commit -m 'branchhead without largefile'
+ $ hg up -qr 0
$ cd ..
Discard all cached largefiles in USERCACHE
@@ -35,7 +38,7 @@
adding changesets
adding manifests
adding file changes
- added 1 changesets with 1 changes to 1 files
+ added 2 changesets with 1 changes to 1 files
(run 'hg update' to get a working copy)
caching new largefiles
0 largefiles cached
@@ -44,7 +47,7 @@
but there is no cache file for it. So, hg must treat it as
"missing"(!) file.
- $ hg update
+ $ hg update -r0
getting changed largefiles
error getting id 7f7097b041ccf68cc5561e9600da4655d21c6d18 from url file:$TESTTMP/mirror for file large: can't get file locally (glob)
0 largefiles updated, 0 removed
@@ -61,7 +64,7 @@
Update working directory to tip, again.
- $ hg update
+ $ hg update -r0
getting changed largefiles
error getting id 7f7097b041ccf68cc5561e9600da4655d21c6d18 from url file:$TESTTMP/mirror for file large: can't get file locally (glob)
0 largefiles updated, 0 removed
@@ -70,6 +73,19 @@
! large
$ cd ..
+Verify that largefiles from pulled branchheads are fetched, also to an empty repo
+
+ $ hg init mirror2
+ $ hg -R mirror2 pull src -r0
+ pulling from src
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ caching new largefiles
+ 1 largefiles cached
+
#if unix-permissions
Portable way to print file permissions:
@@ -90,6 +106,7 @@
$ chmod 660 large
$ echo change >> large
$ hg commit -m change
+ created new head
$ ../ls-l.py .hg/largefiles/e151b474069de4ca6898f67ce2f2a7263adf8fea
640
--- a/tests/test-largefiles.t Mon Mar 11 15:37:28 2013 -0700
+++ b/tests/test-largefiles.t Tue Mar 19 16:19:20 2013 -0700
@@ -919,8 +919,12 @@
$ cd d
More rebase testing, but also test that the largefiles are downloaded from
-'default' instead of 'default-push' when no source is specified (issue3584).
-The error messages go away if repo 'b' is created with --all-largefiles.
+'default-push' when no source is specified (issue3584). (The largefile from the
+pulled revision is however not downloaded but found in the local cache.)
+Largefiles are fetched for the new pulled revision, not for existing revisions,
+rebased or not.
+
+ $ [ ! -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
$ hg pull --rebase --all-largefiles --config paths.default-push=bogus/path --config paths.default=../b
pulling from $TESTTMP/b (glob)
searching for changes
@@ -932,18 +936,9 @@
M sub/normal4
M sub2/large6
saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
- error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file large3: can't get file locally (glob)
- error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large4: can't get file locally (glob)
- error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file large1: can't get file locally (glob)
- error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
- error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
- error getting id 5f78770c0e77ba4287ad6ef3071c9bf9c379742f from url file:$TESTTMP/b for file large1: can't get file locally (glob)
- error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
- error getting id 4669e532d5b2c093a78eca010077e708a071bb64 from url file:$TESTTMP/b for file large1: can't get file locally (glob)
- error getting id 1deebade43c8c498a3c8daddac0244dc55d1331d from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
0 additional largefiles cached
- 9 largefiles failed to download
nothing to rebase
+ $ [ -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
$ hg log --template '{rev}:{node|short} {desc|firstline}\n'
9:598410d3eb9a modify normal file largefile in repo d
8:a381d2c8c80e modify normal file and largefile in repo b
@@ -1255,11 +1250,82 @@
($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4: (glob)
expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
+ changeset 5:9d5af5072dbd: large3 missing
+ (looked for hash baaf12afde9d8d67f25dab6dced0d2bf77dba47c)
+ changeset 5:9d5af5072dbd: sub/large4 missing
+ (looked for hash aeb2210d19f02886dde00dac279729a48471e2f9)
+ changeset 6:4355d653f84f: large3 missing
+ (looked for hash 7838695e10da2bb75ac1156565f40a2595fa2fa0)
verified contents of 15 revisions of 6 largefiles
[1]
- cleanup
$ rm $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
+ $ rm -f .hglf/sub/*.orig
+
+Update to revision with missing largefile - and make sure it really is missing
+
+ $ rm ${USERCACHE}/7838695e10da2bb75ac1156565f40a2595fa2fa0
+ $ hg up -r 6
+ getting changed largefiles
+ error getting id 7838695e10da2bb75ac1156565f40a2595fa2fa0 from url file:$TESTTMP/d for file large3: can't get file locally (glob)
+ 1 largefiles updated, 2 removed
+ 4 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ rm normal3
+ $ echo >> sub/normal4
+ $ hg ci -m 'commit with missing files'
+ Invoking status precommit hook
+ M sub/normal4
+ ! large3
+ ! normal3
+ created new head
+ $ hg st
+ ! large3
+ ! normal3
+ $ hg up -r.
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg st
+ ! large3
+ ! normal3
+ $ hg up -Cr.
+ getting changed largefiles
+ error getting id 7838695e10da2bb75ac1156565f40a2595fa2fa0 from url file:$TESTTMP/d for file large3: can't get file locally (glob)
+ 0 largefiles updated, 0 removed
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg st
+ ! large3
+ $ hg rollback
+ repository tip rolled back to revision 9 (undo commit)
+ working directory now based on revision 6
+
+Merge with revision with missing largefile - and make sure it tries to fetch it.
+
+ $ hg up -Cqr null
+ $ echo f > f
+ $ hg ci -Am branch
+ adding f
+ Invoking status precommit hook
+ A f
+ created new head
+ $ hg merge -r 6
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ getting changed largefiles
+ error getting id 7838695e10da2bb75ac1156565f40a2595fa2fa0 from url file:$TESTTMP/d for file large3: can't get file locally (glob)
+ 1 largefiles updated, 0 removed
+
+ $ hg rollback -q
+ $ hg up -Cq
+
+Pulling 0 revisions with --all-largefiles should not fetch for all revisions
+
+ $ hg pull --all-largefiles
+ pulling from $TESTTMP/d (glob)
+ searching for changes
+ no changes found
+ caching new largefiles
+ 0 largefiles cached
+ 0 additional largefiles cached
Merging does not revert to old versions of largefiles and also check
that merging after having pulled from a non-default remote works
--- a/tests/test-obsolete.t Mon Mar 11 15:37:28 2013 -0700
+++ b/tests/test-obsolete.t Tue Mar 19 16:19:20 2013 -0700
@@ -816,7 +816,7 @@
summary: A
$ hg incoming
- comparing with $TESTTMP/tmpe/repo-issue3805
+ comparing with $TESTTMP/tmpe/repo-issue3805 (glob)
searching for changes
changeset: 2:3816541e5485
tag: tip
@@ -826,7 +826,7 @@
summary: A
$ hg incoming --bundle ../issue3805.hg
- comparing with $TESTTMP/tmpe/repo-issue3805
+ comparing with $TESTTMP/tmpe/repo-issue3805 (glob)
searching for changes
changeset: 2:3816541e5485
tag: tip
@@ -836,7 +836,7 @@
summary: A
$ hg outgoing
- comparing with $TESTTMP/tmpe/repo-issue3805
+ comparing with $TESTTMP/tmpe/repo-issue3805 (glob)
searching for changes
no changes found
[1]
--- a/tests/test-rebase-rename.t Mon Mar 11 15:37:28 2013 -0700
+++ b/tests/test-rebase-rename.t Tue Mar 19 16:19:20 2013 -0700
@@ -12,20 +12,24 @@
$ hg init a
$ cd a
+ $ mkdir d
$ echo a > a
$ hg ci -Am A
adding a
- $ echo b > b
+ $ echo b > d/b
$ hg ci -Am B
- adding b
+ adding d/b
- $ hg mv b b-renamed
+ $ hg mv d d-renamed
+ moving d/b to d-renamed/b
$ hg ci -m 'rename B'
$ hg up -q -C 1
$ hg mv a a-renamed
+ $ echo x > d/x
+ $ hg add d/x
$ hg ci -m 'rename A'
created new head
@@ -47,6 +51,12 @@
diff --git a/a b/a-renamed
rename from a
rename to a-renamed
+ diff --git a/d/x b/d/x
+ new file mode 100644
+ --- /dev/null
+ +++ b/d/x
+ @@ -0,0 +1,1 @@
+ +x
Rebase the revision containing the rename:
@@ -70,23 +80,29 @@
diff --git a/a b/a-renamed
rename from a
rename to a-renamed
+ diff --git a/d-renamed/x b/d-renamed/x
+ new file mode 100644
+ --- /dev/null
+ +++ b/d-renamed/x
+ @@ -0,0 +1,1 @@
+ +x
Rebased revision does not contain information about b (issue3739)
$ hg log -r 3 --debug
- changeset: 3:3b905b1064f14ace3ad02353b79dd42d32981655
+ changeset: 3:032a9b75e83bff1dcfb6cbfa4ef50a704bf1b569
tag: tip
phase: draft
- parent: 2:920a371a5635af23a26a011ca346cecd1cfcb942
+ parent: 2:220d0626d185f372d9d8f69d9c73b0811d7725f7
parent: -1:0000000000000000000000000000000000000000
- manifest: 3:c4a62b2b64593c8fe0523d4c1ba2e243a8bd4dce
+ manifest: 3:035d66b27a1b06b2d12b46d41a39adb7a200c370
user: test
date: Thu Jan 01 00:00:00 1970 +0000
- files+: a-renamed
+ files+: a-renamed d-renamed/x
files-: a
extra: branch=default
- extra: rebase_source=89af05cb38a281f891c6f5581dd027092da29166
+ extra: rebase_source=73a3ee40125d6f0f347082e5831ceccb3f005f8a
description:
rename A