[PATCH 2 of 2] subrepo: warn when adding already tracked files in gitsubrepo
Augie Fackler
raf at durin42.com
Tue Mar 3 10:26:22 CST 2015
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)
> +
> # 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
More information about the Mercurial-devel
mailing list