[PATCH 1 of 3] largefiles: handle commit -A properly, after a --large commit (issue3542)

Na'Tosha Bard natosha at unity3d.com
Tue Aug 7 03:10:43 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 542cfb521b1297a887410173f5971afc537f2fb3
> # Parent  b131e24e2984a610d77e124dd3f58b2b5eda6d1a
> largefiles: handle commit -A properly, after a --large commit (issue3542)
>
> Previous to this, 'commit -A' would add as normal files, files that were
> already
> committed as largefiles, resulting in files being listed twice by 'status
> -A'.
> It also missed when (only) a largefile was deleted, even though status
> reported
> it as '!'.  This also has the side effect of properly reporting the state
> of the
> affected largefiles in the post commit hook after a remove that also
> affected a
> normal file (the largefiles used to be 'R', now are properly absent).
>
> Since scmutil.addremove() is called both by the ui command (after some
> trivial
> argument validation) and during the commit process when -A is specified, it
> seems like a more appropriate method to wrap than the addremove command.
>
> Currently, a repo is only enabled to use largefiles after an add that
> explicitly
> identifies some file as large, and a subsequent commit.  Therefore, this
> patch
> only changes behavior after such a largefile enabling commit.
>
> Note that in the test, if the final commit had a '-v', 'removing large8'
> would
> be printed twice.  Both of these originate in removelargefiles().  The
> first
> print is in verbose mode after traversing remove + forget, the second is
> because
> the '_isaddremove' attr is set and 'after' is not.
>
> diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
> --- a/hgext/largefiles/overrides.py
> +++ b/hgext/largefiles/overrides.py
> @@ -994,11 +994,12 @@
>          else:
>              ui.status(_('largefiles: %d to upload\n') % len(toupload))
>
> -def overrideaddremove(orig, ui, repo, *pats, **opts):
> +def scmutiladdremove(orig, repo, pats=[], opts={}, dry_run=None,
> +                     similarity=None):
>      if not lfutil.islfilesrepo(repo):
> -        return orig(ui, repo, *pats, **opts)
> +        return orig(repo, pats, opts, dry_run, similarity)
>      # Get the list of missing largefiles so we can remove them
> -    lfdirstate = lfutil.openlfdirstate(ui, repo)
> +    lfdirstate = lfutil.openlfdirstate(repo.ui, repo)
>      s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [],
> False,
>          False, False)
>      (unsure, modified, added, removed, missing, unknown, ignored, clean)
> = s
> @@ -1010,16 +1011,16 @@
>      if missing:
>          m = [repo.wjoin(f) for f in missing]
>          repo._isaddremove = True
> -        removelargefiles(ui, repo, *m, **opts)
> +        removelargefiles(repo.ui, repo, *m, **opts)
>          repo._isaddremove = False
>      # Call into the normal add code, and any files that *should* be added
> as
>      # largefiles will be
> -    addlargefiles(ui, repo, *pats, **opts)
> +    addlargefiles(repo.ui, repo, *pats, **opts)
>      # Now that we've handled largefiles, hand off to the original
> addremove
>      # function to take care of the rest.  Make sure it doesn't do
> anything with
>      # largefiles by installing a matcher that will ignore them.
>      installnormalfilesmatchfn(repo[None].manifest())
> -    result = orig(ui, repo, *pats, **opts)
> +    result = orig(repo, pats, opts, dry_run, similarity)
>      restorematchfn()
>      return result
>
> diff --git a/hgext/largefiles/uisetup.py b/hgext/largefiles/uisetup.py
> --- a/hgext/largefiles/uisetup.py
> +++ b/hgext/largefiles/uisetup.py
> @@ -9,7 +9,7 @@
>  '''setup for largefiles extension: uisetup'''
>
>  from mercurial import archival, cmdutil, commands, extensions, filemerge,
> hg, \
> -    httppeer, localrepo, merge, sshpeer, sshserver, wireproto
> +    httppeer, localrepo, merge, scmutil, sshpeer, sshserver, wireproto
>  from mercurial.i18n import _
>  from mercurial.hgweb import hgweb_mod, protocol, webcommands
>  from mercurial.subrepo import hgsubrepo
> @@ -30,8 +30,10 @@
>                                     '(default: 10)'))]
>      entry[1].extend(addopt)
>
> -    entry = extensions.wrapcommand(commands.table, 'addremove',
> -            overrides.overrideaddremove)
> +    # The scmutil function is called both by the (trivial) addremove
> command,
> +    # and in the process of handling commit -A (issue3542)
> +    entry = extensions.wrapfunction(scmutil, 'addremove',
> +                                    overrides.scmutiladdremove)
>      entry = extensions.wrapcommand(commands.table, 'remove',
>                                     overrides.overrideremove)
>      entry = extensions.wrapcommand(commands.table, 'forget',
> diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
> --- a/tests/test-largefiles.t
> +++ b/tests/test-largefiles.t
> @@ -525,6 +525,33 @@
>    C sub2/large6
>    C sub2/large7
>
> +Test commit -A (issue 3542)
> +  $ echo large8 > large8
> +  $ hg add --large large8
> +  $ hg ci -Am 'this used to add large8 as normal and commit both'
> +  Invoking status precommit hook
> +  A large8
> +  Invoking status postcommit hook
> +  C large8
> +  C normal
> +  C normal3
> +  C sub/large4
> +  C sub/normal4
> +  C sub2/large6
> +  C sub2/large7
> +  $ rm large8
> +  $ hg ci -Am 'this used to not notice the rm'
> +  removing large8
> +  Invoking status precommit hook
> +  R large8
> +  Invoking status postcommit hook
> +  C normal
> +  C normal3
> +  C sub/large4
> +  C sub/normal4
> +  C sub2/large6
> +  C sub2/large7
> +
>  Test that a standin can't be added as a large file
>
>    $ touch large
> @@ -570,8 +597,19 @@
>    date:        Thu Jan 01 00:00:00 1970 +0000
>    summary:     removed large
>
> +  changeset:   13:0a3e75774479
> +  user:        test
> +  date:        Thu Jan 01 00:00:00 1970 +0000
> +  summary:     this used to add large8 as normal and commit both
> +
> +  changeset:   14:84f3d378175c
> +  user:        test
> +  date:        Thu Jan 01 00:00:00 1970 +0000
> +  summary:     this used to not notice the rm
> +
>    searching for changes
>    largefiles to upload:
> +  large8
>    large
>    foo
>

I think this patch looks good.

-- 
*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/f26c7ec9/attachment.html>


More information about the Mercurial-devel mailing list