[PATCH 2 of 2] subrepo: warn when adding already tracked files in gitsubrepo

Mathias De Maré mathias.demare at gmail.com
Tue Mar 3 11:38:56 CST 2015


On Tue, Mar 3, 2015 at 5:26 PM, Augie Fackler <raf at durin42.com> wrote:

> On Mon, Mar 02, 2015 at 10:43:41PM -0500, Matt Harbison wrote:
> > # HG changeset patch
> > # User Matt Harbison <matt_harbison at yahoo.com>
> > # Date 1425097842 18000
> > #      Fri Feb 27 23:30:42 2015 -0500
> > # Node ID 24c36aaa69efe05e36a94191d2ca71a96b8c299e
> > # Parent  72f885c8b7aff110a147cc7ff12f5951bf5aaf03
> > subrepo: warn when adding already tracked files in gitsubrepo
>
> queued these, thanks
>
> >
> > This follows normal Mercurial rules, and the message is lifted from
> > workingctx.add().  The file is printed with abs() to be consistent with
> how it
> > is printed in workingctx, even though that is inconsistent with how
> added files
> > are printed in verbose mode.  Further, the 'already tracked'
> notifications come
> > after all of the files that are added are printed, like in Mercurial.
> >
> > As a side effect, we now have the reject list to return to the caller,
> so that
> > 'hg add' exits with the proper code.  It looks like an abort occurs if
> git fails
> > to add the file.  Prior to touching 'snake.python' in the test, this was
> the
> > result of attempting to add the file after a 'git rm':
> >
> >     fatal: pathspec 'snake.python' did not match any files
> >     abort: git add error 128 in s (in subrepo s)
> >
> > I'm not sure what happens when git is a deep subrepo, but the 'in s' and
> > 'in subrepo s' from @annotatesubrepoerror are redundant here.  Maybe we
> should
> > stat the files before invoking git to catch this case and print out the
> prettier
> > hg message?  The other thing missing from workingctx.add() is the call to
> > scmutil.checkportable(), but that would need to borrow the parent's ui
> object.
> >
> > diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
> > --- a/mercurial/subrepo.py
> > +++ b/mercurial/subrepo.py
> > @@ -1530,10 +1530,17 @@
> >          (modified, added, removed,
> >           deleted, unknown, ignored, clean) = self.status(None)
> >
> > +        tracked = set()
> > +        # dirstates 'amn' warn, 'r' is added again
> > +        for l in (modified, added, deleted, clean):
> > +            tracked.update(l)
>
Note that this will not work for clean files right now. That's not really a
major issue, I think.
Additionally, to get this to work for clean files, 'self.status(None)' will
have to be changed to 'self.status(None,  clean=True)'.

Other than that, this patch looks good. Nice additional improvement to add!

Greetings,
Mathias

> > +
> >          # Unknown files not of interest will be rejected by the matcher
> >          files = unknown
> >          files.extend(match.files())
> >
> > +        rejected = []
> > +
> >          files = [f for f in sorted(set(files)) if match(f)]
> >          for f in files:
> >              exact = match.exact(f)
> > @@ -1542,9 +1549,18 @@
> >                  command.append("-f") #should be added, even if ignored
> >              if ui.verbose or not exact:
> >                  ui.status(_('adding %s\n') % match.rel(f))
> > +
> > +            if f in tracked:  # hg prints 'adding' even if already
> tracked
> > +                if exact:
> > +                    rejected.append(f)
> > +                continue
> >              if not opts.get('dry_run'):
> >                  self._gitcommand(command + [f])
> > -        return []
> > +
> > +        for f in rejected:
> > +            ui.warn(_("%s already tracked!\n") % match.abs(f))
> > +
> > +        return rejected
> >
> >      @annotatesubrepoerror
> >      def remove(self):
> > 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
> > @@ -974,7 +974,26 @@
> >    ? s/cpp.cpp
> >    ? s/foobar.orig
> >
> > -currently no error given when adding an already tracked file
> > +error given when adding an already tracked file
> >    $ hg add s/.gitignore
> > +  s/.gitignore already tracked!
> > +  [1]
> > +
> > +removed files can be re-added
> > +  $ hg ci --subrepos -m 'snake'
> > +  committing subrepository s
> > +  $ cd s
> > +  $ git rm snake.python
> > +  rm 'snake.python'
> > +  $ touch snake.python
> > +  $ cd ..
> > +  $ hg add s/snake.python
> > +  $ hg status -S
> > +  M s/snake.python
> > +  ? .hgignore
> > +  ? s/barfoo
> > +  ? s/c.c
> > +  ? s/cpp.cpp
> > +  ? s/foobar.orig
> >
> >    $ cd ..
> > _______________________________________________
> > Mercurial-devel mailing list
> > Mercurial-devel at selenic.com
> > http://selenic.com/mailman/listinfo/mercurial-devel
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20150303/1f77732a/attachment.html>


More information about the Mercurial-devel mailing list