[PATCH] subrepo: add status support for ignored and clean files in git subrepos
Matt Harbison
mharbison72 at gmail.com
Tue Mar 10 18:35:24 CDT 2015
On Tue, 10 Mar 2015 14:08:37 -0400, <mathias.demare at gmail.com> wrote:
> # HG changeset patch
> # User Mathias De Maré <mathias.demare at gmail.com>
> # Date 1425935649 -3600
> # Mon Mar 09 22:14:09 2015 +0100
> # Node ID 16c867316afce2f57716dbdf93dd5b0760186010
> # Parent 02d7b5cd373bbb4e8263dad9bfbf9c4c3b0e4e3a
> subrepo: add status support for ignored and clean files in git subrepos
>
> diff -r 02d7b5cd373b -r 16c867316afc mercurial/subrepo.py
> --- a/mercurial/subrepo.py Tue Feb 10 15:59:12 2015 -0500
> +++ b/mercurial/subrepo.py Mon Mar 09 22:14:09 2015 +0100
> @@ -1662,13 +1662,42 @@
> deleted, unknown, ignored, clean = [], [], [], []
> + command = ['status', '--porcelain', '-z']
> if opts.get('unknown'):
> - command = ['ls-files', '--others', '--exclude-standard']
> - out = self._gitcommand(command)
> - for line in out.split('\n'):
> - if len(line) == 0:
> - continue
> - unknown.append(line)
> + command += ['--untracked-files=all']
> + if opts.get('ignored'):
> + command += ['--ignored']
> + out = self._gitcommand(command)
Small nit: should this command execution be skipped if neither 'ignored'
or 'unknown' are set? (And possibly 'clean', but see below.)
> +
> + changedfiles = set()
> + changedfiles.update(modified)
> + changedfiles.update(added)
> + changedfiles.update(removed)
> + for line in out.split('\0'):
> + if not line:
> + continue
> + st = line[0:2]
> + #moves and copies show 2 files on one line
> + if line.find('\0') >= 0:
> + filename1, filename2 = line[3:].split('\0')
> + else:
> + filename1 = line[3:]
> + filename2 = None
> +
> + changedfiles.add(filename1)
> + if filename2:
> + changedfiles.add(filename2)
I don't fully understand this, but it may be my lack of git knowledge.
From what I can understand from the git help on status, the file names are
the source and destination. But adding both would seem to block both from
the clean list below.
Consider a clean working dir, and then 'hg cp foo bar'. In this case foo
is 'C', and bar is 'A'. Alternately, with 'hg mv foo bar', foo is 'R' and
bar is 'A'. The added/removed list would cover the exclusion list below
in hg, is that not true with git? Minimally it seems possible to have a
clean copy source.
Otherwise, LGTM.
> +
> + if st == '??':
> + unknown.append(filename1)
> + elif st == '!!':
> + ignored.append(filename1)
> +
> + if opts.get('clean'):
> + out = self._gitcommand(['ls-files'])
> + for f in out.split('\n'):
> + if not f in changedfiles:
> + clean.append(f)
> return scmutil.status(modified, added, removed, deleted,
> unknown, ignored, clean)
> diff -r 02d7b5cd373b -r 16c867316afc tests/test-subrepo-git.t
> --- a/tests/test-subrepo-git.t Tue Feb 10 15:59:12 2015 -0500
> +++ b/tests/test-subrepo-git.t Mon Mar 09 22:14:09 2015 +0100
> @@ -175,6 +175,8 @@
> pulling subrepo s from $TESTTMP/gitroot
> 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
> (branch merge, don't forget to commit)
> + $ hg st --subrepos s
> + A s/f
> $ cat s/f
> f
> $ cat s/g
> @@ -944,6 +946,16 @@
> ? s/c.c
> ? s/cpp.cpp
> ? s/foobar.orig
> + $ hg st --subrepos s --all
> + A s/.gitignore
> + ? s/barfoo
> + ? s/c.c
> + ? s/cpp.cpp
> + ? s/foobar.orig
> + I s/snake.python
> + C s/f
> + C s/foobar
> + C s/g
> $ hg add --subrepos "glob:**.python"
> $ hg st --subrepos s
> A s/.gitignore
> @@ -978,13 +990,41 @@
> $ hg add s/.gitignore
> s/.gitignore already tracked!
> [1]
> + $ hg add s/g
> + s/g already tracked!
> + [1]
> removed files can be re-added
> +removing files using 'rm' or 'git rm' has the same effect,
> +since we ignore the staging area
> $ hg ci --subrepos -m 'snake'
> committing subrepository s
> $ cd s
> + $ rm snake.python
> +(remove leftover .hg so Mercurial doesn't look for a root here)
> + $ rm -r .hg
> + $ hg status --subrepos --all .
> + R snake.python
> + ? barfoo
> + ? c.c
> + ? cpp.cpp
> + ? foobar.orig
> + C .gitignore
> + C f
> + C foobar
> + C g
> $ git rm snake.python
> rm 'snake.python'
> + $ hg status --subrepos --all .
> + R snake.python
> + ? barfoo
> + ? c.c
> + ? cpp.cpp
> + ? foobar.orig
> + C .gitignore
> + C f
> + C foobar
> + C g
> $ touch snake.python
> $ cd ..
> $ hg add s/snake.python
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list