[PATCH 2 of 3] largefiles: enable islfilesrepo() prior to a commit (issue3541)
Na'Tosha Bard
natosha at unity3d.com
Tue Aug 7 03:21:44 CDT 2012
2012/8/7 Matt Harbison <matt_harbison at yahoo.com>
> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1343696201 14400
> # Node ID 40fc3ecfffc7727537a11f5a26064e97f1dd0e7b
> # Parent 542cfb521b1297a887410173f5971afc537f2fb3
> largefiles: enable islfilesrepo() prior to a commit (issue3541)
>
> Previously, even if a file was added with --large, 'hg addremove' or 'hg
> ci -A'
> would add all files (including the previously added large files) as normal
> files. Only after a commit where a file was added with --large would
> subsequent
> adds or 'ci -A' take into account the minsize or the pattern configuration.
> This change more closely follows the help for largefiles, which mentions
> that
> 'add --large' is required to enable the configuration, but doesn't mention
> the
> previously required commit.
>
> Also, if 'hg add --large' was performed and then 'hg forget <file>' (both
> before
> a largefile enabling commit), the forget command would error out saying
> '.hglf/<file> not tracked'. This is also fixed.
>
> This reports that a repo is largefiles enabled as soon as a file is added
> with
> --large, which enables 'add', 'addremove' and 'ci -A' to honor the config
> settings before the first commit. Note that prior to the next commit, if
> all
> largefiles are forgotten, the repository goes back to reporting the repo
> as not
> largefiles enabled.
>
> It makes no sense to handle this by adding a --large option to 'addremove',
> because then it would also be needed for 'commit', but only when '-A' is
> specified. While this gets around the awkwardness of having to add a
> largefile,
> then commit it, and then addremove the other files when importing an
> existing
> codebase (and preserving that extra commit in permanent history), it does
> still
> require finding and manually adding one of the files as --large.
> Therefore it
> is probably desirable to have a --large option for init as well.
>
> diff --git a/hgext/largefiles/lfutil.py b/hgext/largefiles/lfutil.py
> --- a/hgext/largefiles/lfutil.py
> +++ b/hgext/largefiles/lfutil.py
> @@ -141,7 +141,7 @@
> def normallookup(self, f):
> return super(largefilesdirstate, self).normallookup(unixpath(f))
>
> -def openlfdirstate(ui, repo):
> +def openlfdirstate(ui, repo, create=True):
> '''
> Return a dirstate object that tracks largefiles: i.e. its root is
> the repo root, but it is saved in .hg/largefiles/dirstate.
> @@ -154,7 +154,7 @@
> # If the largefiles dirstate does not exist, populate and create
> # it. This ensures that we create it on the first meaningful
> # largefiles operation in a new clone.
> - if not os.path.exists(os.path.join(admin, 'dirstate')):
> + if create and not os.path.exists(os.path.join(admin, 'dirstate')):
> util.makedirs(admin)
> matcher = getstandinmatcher(repo)
> for standin in dirstatewalk(repo.dirstate, matcher):
> @@ -435,8 +435,11 @@
> return util.pconvert(os.path.normpath(path))
>
> def islfilesrepo(repo):
> - return ('largefiles' in repo.requirements and
> - util.any(shortname + '/' in f[0] for f in
> repo.store.datafiles()))
> + if ('largefiles' in repo.requirements and
> + util.any(shortname + '/' in f[0] for f in
> repo.store.datafiles())):
> + return True
> +
> + return util.any(openlfdirstate(repo.ui, repo, False))
>
Does this have any effect on performance?
> class storeprotonotcapable(Exception):
> def __init__(self, storetypes):
> diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
> --- a/tests/test-largefiles.t
> +++ b/tests/test-largefiles.t
> @@ -1483,3 +1483,40 @@
> lf_subrepo_archive/subrepo/normal.txt
>
> $ cd ..
> +
> +Test that addremove picks up largefiles prior to the initial commit
> (issue3541)
> +
> + $ hg init addrm2
> + $ cd addrm2
> + $ touch large.dat
> + $ touch large2.dat
> + $ touch normal
> + $ hg add --large large.dat
> + $ hg addremove -v
> + adding large2.dat as a largefile
> + adding normal
> +
> +Test that forgetting all largefiles reverts to islfilesrepo() == False
> +(addremove will add *.dat as normal files now)
> + $ hg forget large.dat
> + $ hg forget large2.dat
> + $ hg addremove -v
> + adding large.dat
> + adding large2.dat
> +
> +Test commit's addremove option prior to the first commit
> + $ hg forget large.dat
> + $ hg forget large2.dat
> + $ hg add --large large.dat
> + $ hg ci -Am "commit"
> + adding large2.dat as a largefile
> + Invoking status precommit hook
> + A large.dat
> + A large2.dat
> + A normal
> + $ find .hglf/ | sort
> + .hglf/
> + .hglf/large.dat
> + .hglf/large2.dat
> +
> + $ cd ..
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>
--
*Na'Tosha Bard*
Software 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/20120807/a15cdb8e/attachment.html>
More information about the Mercurial-devel
mailing list