[PATCH STABLE] archive: always use portable path component separators with subrepos
Augie Fackler
raf at durin42.com
Tue May 5 08:59:08 CDT 2015
On Mon, May 04, 2015 at 11:52:40PM -0400, Matt Harbison wrote:
> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1430793209 14400
> # Mon May 04 22:33:29 2015 -0400
> # Branch stable
> # Node ID a5badc8a9ff5b5a94ff11d4ee1b18899c6bebda5
> # Parent a4ee6f774f14b68e8dc887745699ba6a2ae28355
> archive: always use portable path component separators with subrepos
queued for stable, thanks
>
> The previous behavior when archiving a subrepo 's' on Windows was to internally
> name the file under it 's\file', due to the use of vfs.reljoin(). When printing
> the file list from the archive on Windows or Linux, the file was named
> 's\\file'. The archive extracted OK on Windows, but if the archive was brought
> to a Linux system, it created a file named 's\file' instead of a directory 's'
> containing 'file'.
>
> *.zip format achives seemed not to have the problem, but this was definitely an
> issue with *.tgz archives.
>
> Largefiles actually got this right, but a test is added to keep this from
> regressing. The subrepo-deep-nested-change.t test was repurposed to archive to
> a file, since there are several subsequent tests that archive to a directory.
> The output change is losing the filesystem prefix '../archive_lf' and not
> listing the directories 'sub1' and 'sub1/sub2'.
>
> diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
> --- a/mercurial/subrepo.py
> +++ b/mercurial/subrepo.py
> @@ -517,7 +517,7 @@
> flags = self.fileflags(name)
> mode = 'x' in flags and 0755 or 0644
> symlink = 'l' in flags
> - archiver.addfile(self.wvfs.reljoin(prefix, self._path, name),
> + archiver.addfile(prefix + self._path + '/' + name,
> mode, symlink, self.filedata(name))
> self.ui.progress(_('archiving (%s)') % relpath, i + 1,
> unit=_('files'), total=total)
> @@ -731,8 +731,7 @@
> for subpath in ctx.substate:
> s = subrepo(ctx, subpath)
> submatch = matchmod.narrowmatcher(subpath, match)
> - total += s.archive(
> - archiver, self.wvfs.reljoin(prefix, self._path), submatch)
> + total += s.archive(archiver, prefix + self._path + '/', submatch)
> return total
>
> @annotatesubrepoerror
> @@ -1675,7 +1674,7 @@
> data = info.linkname
> else:
> data = tar.extractfile(info).read()
> - archiver.addfile(self.wvfs.reljoin(prefix, self._path, info.name),
> + archiver.addfile(prefix + self._path + '/' + info.name,
> info.mode, info.issym(), data)
> total += 1
> self.ui.progress(_('archiving (%s)') % relpath, i + 1,
> diff --git a/tests/test-subrepo-deep-nested-change.t b/tests/test-subrepo-deep-nested-change.t
> --- a/tests/test-subrepo-deep-nested-change.t
> +++ b/tests/test-subrepo-deep-nested-change.t
> @@ -309,21 +309,17 @@
>
> Exclude normal files from main and sub-sub repo
>
> - $ hg --config extensions.largefiles= archive -S -X '**.txt' ../archive_lf
> - $ find ../archive_lf | sort
> - ../archive_lf
> - ../archive_lf/.hgsub
> - ../archive_lf/.hgsubstate
> - ../archive_lf/large.bin
> - ../archive_lf/main
> - ../archive_lf/sub1
> - ../archive_lf/sub1/.hgsub
> - ../archive_lf/sub1/.hgsubstate
> - ../archive_lf/sub1/sub1
> - ../archive_lf/sub1/sub2
> - ../archive_lf/sub1/sub2/large.bin
> - ../archive_lf/sub1/sub2/sub2
> - $ rm -rf ../archive_lf
> + $ hg --config extensions.largefiles= archive -S -X '**.txt' ../archive_lf.tgz
> + $ tar -tzf ../archive_lf.tgz | sort
> + archive_lf/.hgsub
> + archive_lf/.hgsubstate
> + archive_lf/large.bin
> + archive_lf/main
> + archive_lf/sub1/.hgsub
> + archive_lf/sub1/.hgsubstate
> + archive_lf/sub1/sub1
> + archive_lf/sub1/sub2/large.bin
> + archive_lf/sub1/sub2/sub2
>
> Include normal files from within a largefiles subrepo
>
> diff --git a/tests/test-subrepo-git.t b/tests/test-subrepo-git.t
> --- a/tests/test-subrepo-git.t
> +++ b/tests/test-subrepo-git.t
> @@ -325,6 +325,14 @@
> ../archive_x/s
> ../archive_x/s/g
>
> + $ hg -R ../tc archive -S ../archive.tgz 2>/dev/null
> + $ tar -tzf ../archive.tgz | sort
> + archive/.hg_archival.txt
> + archive/.hgsub
> + archive/.hgsubstate
> + archive/a
> + archive/s/g
> +
> create nested repo
>
> $ cd ..
> diff --git a/tests/test-subrepo-recursion.t b/tests/test-subrepo-recursion.t
> --- a/tests/test-subrepo-recursion.t
> +++ b/tests/test-subrepo-recursion.t
> @@ -434,6 +434,18 @@
> cloning subrepo foo/bar from $TESTTMP/repo/foo/bar (glob)
> #endif
>
> +Archive + subrepos uses '/' for all component separators
> +
> + $ tar -tzf ../archive.tar.gz | sort
> + archive/.hg_archival.txt
> + archive/.hgsub
> + archive/.hgsubstate
> + archive/foo/.hgsub
> + archive/foo/.hgsubstate
> + archive/foo/bar/z.txt
> + archive/foo/y.txt
> + archive/x.txt
> +
> The newly cloned subrepos contain no working copy:
>
> $ hg -R foo summary
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list