[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