[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