[PATCH STABLE] largefiles: make archive -S store largefiles instead of standins

Na'Tosha Bard natosha at unity3d.com
Wed May 2 08:02:47 CDT 2012


2012/5/1 Matt Harbison <matt_harbison at yahoo.com>

> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1335409636 14400
> # Branch stable
> # Node ID 761b5d75c06a5161549522ce6eb7b4b57d2d503d
> # Parent  038b389d80f5a31520c454d78245968de1ecf655
> largefiles: make archive -S store largefiles instead of standins
>
> This is essentially a copy of largefile's override of archive() in the
> archival class, adapted for overriding hgsubrepo's archive().  That
> means decoding isn't taken into consideration, nor is .hg_archival.txt
> generated (the same goes for regular subrepos).  Unlike subrepos, but
> consistent with largefile's handling of the top repo, ui.progress() is
> *not* called.  This should probably be refactored at some point, but
> at least this generates the archives properly for now.  Previously,
> the standins were ignored and the largefiles were archived only for
> the top level repo.
>
> Long term, it would probably be most desirable to figure out how to
> tweak archival's archive() if necessary such that largefiles doesn't
> need to override it completely just to special case the translating of
> standins to the real files.  Largefiles will already return a context
> with the true largefiles instead of the standins if lfilesrepo's
> lfstatus is True- perhaps this can be leveraged?
>
> diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
> --- a/hgext/largefiles/overrides.py
> +++ b/hgext/largefiles/overrides.py
> @@ -781,6 +781,47 @@
>
>     archiver.done()
>
> +def overridearchivefn(orig, repo, ui, archiver, prefix):
>

This is a nitpick, but if this can't be combined into existing code (and I
don't see a good place to do so either), wouldn't it at least be better
named something like 'overridearchivesubrepos', or 'archivesubrepos' or
similar?  When looking at overrides.py, there's no obvious indication as to
why on earth we need an 'overridearchive' and 'overridearchivefn'.

Cheers,
Na'Tosha


> +    rev = repo._state[1]
> +    ctx = repo._repo[rev]
> +
> +    lfcommands.cachelfiles(ui, repo._repo, ctx.node())
> +
> +    def write(name, mode, islink, getdata):
> +        if lfutil.isstandin(name):
> +            return
> +        data = getdata()
> +
> +        archiver.addfile(prefix + repo._path + '/' + name, mode, islink,
> data)
> +
> +    for f in ctx:
> +        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))
> +            f = lfutil.splitstandin(f)
> +
> +            def getdatafn():
> +                fd = None
> +                try:
> +                    fd = open(os.path.join(prefix, path), 'rb')
> +                    return fd.read()
> +                finally:
> +                    if fd:
> +                        fd.close()
> +
> +            getdata = getdatafn
> +
> +        write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
> +
> +    for subpath in ctx.substate:
> +        sub = ctx.sub(subpath)
> +        sub.archive(repo.ui, archiver, prefix)
> +
>  # If a largefile is modified, the change is not reflected in its
>  # standin until a commit. cmdutil.bailifchanged() raises an exception
>  # if the repo has uncommitted changes. Wrap it to also check if
> diff --git a/hgext/largefiles/uisetup.py b/hgext/largefiles/uisetup.py
> --- a/hgext/largefiles/uisetup.py
> +++ b/hgext/largefiles/uisetup.py
> @@ -100,6 +100,7 @@
>     extensions.wrapfunction(hg, 'merge', overrides.hgmerge)
>
>     extensions.wrapfunction(archival, 'archive', overrides.overridearchive)
> +    extensions.wrapfunction(hgsubrepo, 'archive',
> overrides.overridearchivefn)
>     extensions.wrapfunction(cmdutil, 'bailifchanged',
>                             overrides.overridebailifchanged)
>
> diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
> --- a/tests/test-largefiles.t
> +++ b/tests/test-largefiles.t
> @@ -1096,4 +1096,34 @@
>   abort: uncommitted changes in subrepo subrepo
>   (use --subrepos for recursive commit)
>   [255]
> +
> +# Add a normal file to the subrepo, then test archiving
> +  $ echo 'normal file' > subrepo/normal.txt
> +  $ hg -R subrepo add subrepo/normal.txt
> +# Lock in subrepo, otherwise the change isn't archived
> +  $ hg ci -S -m "add normal file to top level"
> +  committing subrepository subrepo
> +  Invoking status precommit hook
> +  M large.txt
> +  A normal.txt
> +  Invoking status precommit hook
> +  M .hgsubstate
> +  $ hg archive -S lf_subrepo_archive
> +  $ find lf_subrepo_archive -print
> +  lf_subrepo_archive
> +  lf_subrepo_archive/.hg_archival.txt
> +  lf_subrepo_archive/.hgsubstate
> +  lf_subrepo_archive/subrepo
> +  lf_subrepo_archive/subrepo/large.txt
> +  lf_subrepo_archive/subrepo/normal.txt
> +  lf_subrepo_archive/a
> +  lf_subrepo_archive/a/b
> +  lf_subrepo_archive/a/b/c
> +  lf_subrepo_archive/a/b/c/d
> +  lf_subrepo_archive/a/b/c/d/e.normal.txt
> +  lf_subrepo_archive/a/b/c/d/e.large.txt
> +  lf_subrepo_archive/a/b/c/x
> +  lf_subrepo_archive/a/b/c/x/y.normal.txt
> +  lf_subrepo_archive/.hgsub
> +
>   $ cd ..
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>



-- 
*Na'Tosha Bard*
Build & Infrastructure Developer | Unity Technologies - Copenhagen

*E-Mail:* natosha at unity3d.com
*Skype:* natosha.bard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20120502/506a3a71/attachment.html>


More information about the Mercurial-devel mailing list