archive: support 'wdir()'
This is a step toward replacing the extdiff internals with archive, in order to
support 'extdiff -S'. Only Mercurial subrepos are supported for now.
If a file is missing from the filesystem, it is silently skipped. Perhaps it
should warn, but it cannot abort when working with extdiff because deleting a
file is a legitimate diff.
--- a/hgext/largefiles/overrides.py Tue Jun 16 23:03:36 2015 -0400
+++ b/hgext/largefiles/overrides.py Tue Jun 16 23:06:57 2015 -0400
@@ -882,7 +882,8 @@
prefix='', mtime=None, subrepos=None):
# No need to lock because we are only reading history and
# largefile caches, neither of which are modified.
- lfcommands.cachelfiles(repo.ui, repo, node)
+ if node is not None:
+ lfcommands.cachelfiles(repo.ui, repo, node)
if kind not in archival.archivers:
raise util.Abort(_("unknown archive type '%s'") % kind)
@@ -914,11 +915,16 @@
ff = ctx.flags(f)
getdata = ctx[f].data
if lfutil.isstandin(f):
- path = lfutil.findfile(repo, getdata().strip())
- if path is None:
- raise util.Abort(
- _('largefile %s not found in repo store or system cache')
- % lfutil.splitstandin(f))
+ if node is not None:
+ path = lfutil.findfile(repo, getdata().strip())
+
+ if path is None:
+ raise util.Abort(
+ _('largefile %s not found in repo store or system cache')
+ % lfutil.splitstandin(f))
+ else:
+ path = lfutil.splitstandin(f)
+
f = lfutil.splitstandin(f)
def getdatafn():
@@ -935,7 +941,7 @@
if subrepos:
for subpath in sorted(ctx.substate):
- sub = ctx.sub(subpath)
+ sub = ctx.workingsub(subpath)
submatch = match_.narrowmatcher(subpath, matchfn)
sub.archive(archiver, prefix, submatch)
@@ -946,7 +952,8 @@
rev = repo._state[1]
ctx = repo._repo[rev]
- lfcommands.cachelfiles(repo.ui, repo._repo, ctx.node())
+ if ctx.node() is not None:
+ lfcommands.cachelfiles(repo.ui, repo._repo, ctx.node())
def write(name, mode, islink, getdata):
# At this point, the standin has been replaced with the largefile name,
@@ -961,11 +968,16 @@
ff = ctx.flags(f)
getdata = ctx[f].data
if lfutil.isstandin(f):
- path = lfutil.findfile(repo._repo, getdata().strip())
- if path is None:
- raise util.Abort(
- _('largefile %s not found in repo store or system cache')
- % lfutil.splitstandin(f))
+ if ctx.node() is not None:
+ path = lfutil.findfile(repo._repo, getdata().strip())
+
+ if path is None:
+ raise util.Abort(
+ _('largefile %s not found in repo store or system cache')
+ % lfutil.splitstandin(f))
+ else:
+ path = lfutil.splitstandin(f)
+
f = lfutil.splitstandin(f)
def getdatafn():
@@ -982,7 +994,7 @@
write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
for subpath in sorted(ctx.substate):
- sub = ctx.sub(subpath)
+ sub = ctx.workingsub(subpath)
submatch = match_.narrowmatcher(subpath, match)
sub.archive(archiver, prefix + repo._path + '/', submatch)
--- a/mercurial/archival.py Tue Jun 16 23:03:36 2015 -0400
+++ b/mercurial/archival.py Tue Jun 16 23:06:57 2015 -0400
@@ -315,7 +315,7 @@
if subrepos:
for subpath in sorted(ctx.substate):
- sub = ctx.sub(subpath)
+ sub = ctx.workingsub(subpath)
submatch = matchmod.narrowmatcher(subpath, matchfn)
total += sub.archive(archiver, prefix, submatch)
--- a/mercurial/subrepo.py Tue Jun 16 23:03:36 2015 -0400
+++ b/mercurial/subrepo.py Tue Jun 16 23:06:57 2015 -0400
@@ -762,7 +762,7 @@
rev = self._state[1]
ctx = self._repo[rev]
for subpath in ctx.substate:
- s = subrepo(ctx, subpath)
+ s = subrepo(ctx, subpath, True)
submatch = matchmod.narrowmatcher(subpath, match)
total += s.archive(archiver, prefix + self._path + '/', submatch)
return total
--- a/tests/test-subrepo-deep-nested-change.t Tue Jun 16 23:03:36 2015 -0400
+++ b/tests/test-subrepo-deep-nested-change.t Tue Jun 16 23:06:57 2015 -0400
@@ -168,6 +168,41 @@
A foo/bar/abc
A sub1/foo
R sub1/sub2/test.txt
+
+Archive wdir() with subrepos
+ $ hg rm main
+ $ hg archive -S -r 'wdir()' ../wdir
+ $ diff -r . ../wdir | grep -v '\.hg$'
+ Only in ../wdir: .hg_archival.txt
+
+ $ find ../wdir -type f | sort
+ ../wdir/.hg_archival.txt
+ ../wdir/.hgsub
+ ../wdir/.hgsubstate
+ ../wdir/foo/bar/abc
+ ../wdir/sub1/.hgsub
+ ../wdir/sub1/.hgsubstate
+ ../wdir/sub1/foo
+ ../wdir/sub1/sub1
+ ../wdir/sub1/sub2/folder/test.txt
+ ../wdir/sub1/sub2/sub2
+
+Attempting to archive 'wdir()' with a missing file is handled gracefully
+ $ rm sub1/sub1
+ $ rm -r ../wdir
+ $ hg archive -v -S -r 'wdir()' ../wdir
+ $ find ../wdir -type f | sort
+ ../wdir/.hg_archival.txt
+ ../wdir/.hgsub
+ ../wdir/.hgsubstate
+ ../wdir/foo/bar/abc
+ ../wdir/sub1/.hgsub
+ ../wdir/sub1/.hgsubstate
+ ../wdir/sub1/foo
+ ../wdir/sub1/sub2/folder/test.txt
+ ../wdir/sub1/sub2/sub2
+
+Continue relative path printing + subrepos
$ hg update -Cq
$ touch sub1/sub2/folder/bar
$ hg addremove sub1/sub2
@@ -469,8 +504,69 @@
? sub1/sub2/untracked.txt
? sub1/sub2/x.txt
$ hg add sub1/sub2
+
+ $ hg archive -S -r 'wdir()' ../wdir2
+ $ diff -r . ../wdir2 | grep -v '\.hg$'
+ Only in ../wdir2: .hg_archival.txt
+ Only in .: .hglf
+ Only in .: foo
+ Only in ./sub1/sub2: large.bin
+ Only in ./sub1/sub2: test.txt
+ Only in ./sub1/sub2: untracked.txt
+ Only in ./sub1/sub2: x.txt
+ $ find ../wdir2 -type f | sort
+ ../wdir2/.hg_archival.txt
+ ../wdir2/.hgsub
+ ../wdir2/.hgsubstate
+ ../wdir2/large.bin
+ ../wdir2/main
+ ../wdir2/sub1/.hgsub
+ ../wdir2/sub1/.hgsubstate
+ ../wdir2/sub1/sub1
+ ../wdir2/sub1/sub2/folder/test.txt
+ ../wdir2/sub1/sub2/large.dat
+ ../wdir2/sub1/sub2/sub2
+ $ hg status -S -mac -n | sort
+ .hgsub
+ .hgsubstate
+ large.bin
+ main
+ sub1/.hgsub
+ sub1/.hgsubstate
+ sub1/sub1
+ sub1/sub2/folder/test.txt
+ sub1/sub2/large.dat
+ sub1/sub2/sub2
+
$ hg ci -Sqm 'forget testing'
+Test 'wdir()' modified file archiving with largefiles
+ $ echo 'mod' > main
+ $ echo 'mod' > large.bin
+ $ echo 'mod' > sub1/sub2/large.dat
+ $ hg archive -S -r 'wdir()' ../wdir3
+ $ diff -r . ../wdir3 | grep -v '\.hg$'
+ Only in ../wdir3: .hg_archival.txt
+ Only in .: .hglf
+ Only in .: foo
+ Only in ./sub1/sub2: large.bin
+ Only in ./sub1/sub2: test.txt
+ Only in ./sub1/sub2: untracked.txt
+ Only in ./sub1/sub2: x.txt
+ $ find ../wdir3 -type f | sort
+ ../wdir3/.hg_archival.txt
+ ../wdir3/.hgsub
+ ../wdir3/.hgsubstate
+ ../wdir3/large.bin
+ ../wdir3/main
+ ../wdir3/sub1/.hgsub
+ ../wdir3/sub1/.hgsubstate
+ ../wdir3/sub1/sub1
+ ../wdir3/sub1/sub2/folder/test.txt
+ ../wdir3/sub1/sub2/large.dat
+ ../wdir3/sub1/sub2/sub2
+ $ hg up -Cq
+
Test issue4330: commit a directory where only normal files have changed
$ touch foo/bar/large.dat
$ hg add --large foo/bar/large.dat