Submitter | Matt Harbison |
---|---|
Date | Jan. 18, 2015, 9:28 p.m. |
Message ID | <c27d3218ffa9096bb081.1421616485@Envy> |
Download | mbox | patch |
Permalink | /patch/7515/ |
State | Accepted |
Commit | ab6fd3205dadcd5985658febb3738425a9fac710 |
Headers | show |
Comments
On Sun, 2015-01-18 at 16:28 -0500, Matt Harbison wrote: > # HG changeset patch > # User Matt Harbison <matt_harbison@yahoo.com> > # Date 1421612140 18000 > # Sun Jan 18 15:15:40 2015 -0500 > # Branch stable > # Node ID c27d3218ffa9096bb0812e30d5e66a05b88a92d6 > # Parent cb21ffd4b6c7e6572e6ab33fb3dfb18949b1ecd7 > largefiles: fix commit of a directory with no largefile changes (issue4330) This is queued for stable, thanks.
On Sun, 18 Jan 2015 19:29:51 -0500, Matt Mackall <mpm@selenic.com> wrote: > On Sun, 2015-01-18 at 16:28 -0500, Matt Harbison wrote: >> # HG changeset patch >> # User Matt Harbison <matt_harbison@yahoo.com> >> # Date 1421612140 18000 >> # Sun Jan 18 15:15:40 2015 -0500 >> # Branch stable >> # Node ID c27d3218ffa9096bb0812e30d5e66a05b88a92d6 >> # Parent cb21ffd4b6c7e6572e6ab33fb3dfb18949b1ecd7 >> largefiles: fix commit of a directory with no largefile changes >> (issue4330) > > This is queued for stable, thanks. > Is the OS specific status behavior expected, w.r.t. whether match() is called when no directories are named? Any status expert that needs to be poked to look at this? I wasn't able to make anything fail from the command line, so maybe it's just an optimization. --Matt
On Sun, 2015-01-18 at 19:49 -0500, Matt Harbison wrote: > On Sun, 18 Jan 2015 19:29:51 -0500, Matt Mackall <mpm@selenic.com> wrote: > > > On Sun, 2015-01-18 at 16:28 -0500, Matt Harbison wrote: > >> # HG changeset patch > >> # User Matt Harbison <matt_harbison@yahoo.com> > >> # Date 1421612140 18000 > >> # Sun Jan 18 15:15:40 2015 -0500 > >> # Branch stable > >> # Node ID c27d3218ffa9096bb0812e30d5e66a05b88a92d6 > >> # Parent cb21ffd4b6c7e6572e6ab33fb3dfb18949b1ecd7 > >> largefiles: fix commit of a directory with no largefile changes > >> (issue4330) > > > > This is queued for stable, thanks. > > > > Is the OS specific status behavior expected, w.r.t. whether match() is > called when no directories are named? Nope. At a guess, the Windows version of the behavior is probably the unintended one.
On Tue, 20 Jan 2015 16:47:14 -0500, Matt Mackall <mpm@selenic.com> wrote: > On Sun, 2015-01-18 at 19:49 -0500, Matt Harbison wrote: >> On Sun, 18 Jan 2015 19:29:51 -0500, Matt Mackall <mpm@selenic.com> >> wrote: >> >> > On Sun, 2015-01-18 at 16:28 -0500, Matt Harbison wrote: >> >> # HG changeset patch >> >> # User Matt Harbison <matt_harbison@yahoo.com> >> >> # Date 1421612140 18000 >> >> # Sun Jan 18 15:15:40 2015 -0500 >> >> # Branch stable >> >> # Node ID c27d3218ffa9096bb0812e30d5e66a05b88a92d6 >> >> # Parent cb21ffd4b6c7e6572e6ab33fb3dfb18949b1ecd7 >> >> largefiles: fix commit of a directory with no largefile changes >> >> (issue4330) >> > >> > This is queued for stable, thanks. >> > >> >> Is the OS specific status behavior expected, w.r.t. whether match() is >> called when no directories are named? > > Nope. At a guess, the Windows version of the behavior is probably the > unintended one. > For the benefit of anybody searching the archives in the future, this isn't OS dependent- it is filesystem dependent. I messed up the Linux vfat setup, and didn't actually run it on a vfat fs. When I did, it exhibited the same behavior as Windows. What happens is that in dirstate.walk(), running on a case insensitive filesystem forces step 3 to run, which passes every single file in dirstate to the matcher's match function. Any matches are returned from walk(). If there are no directories in the matcher's file list, step 3 is skipped on case sensitive filesystems. Thus the need to add '.' to force the full walk. The code as committed is correct, but I'll update the comment after default is reopened. --Matt
Patch
diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py --- a/hgext/largefiles/reposetup.py +++ b/hgext/largefiles/reposetup.py @@ -326,7 +326,12 @@ if self.dirstate.normalize(lf).startswith(d): actualfiles.append(lf) if not matcheddir: - actualfiles.append(lfutil.standin(f)) + # There may still be normal files in the dir, so + # make sure a directory is in the list, which + # forces status to walk and call the match + # function on the matcher. Windows does NOT + # require this. + actualfiles.append('.') matcheddir = True # Nothing in dir, so readd it # and let commit reject it diff --git a/tests/test-subrepo-deep-nested-change.t b/tests/test-subrepo-deep-nested-change.t --- a/tests/test-subrepo-deep-nested-change.t +++ b/tests/test-subrepo-deep-nested-change.t @@ -351,5 +351,30 @@ R sub1/sub2/test.txt ? foo/bar/abc ? sub1/sub2/untracked.txt + $ hg add sub1/sub2 + $ hg ci -Sqm 'forget testing' + +Test issue4330: commit a directory where only normal files have changed + $ touch foo/bar/large.dat + $ hg add --large foo/bar/large.dat + $ hg ci -m 'add foo/bar/large.dat' + $ touch a.txt + $ touch a.dat + $ hg add -v foo/bar/abc a.txt a.dat + adding a.dat as a largefile + adding a.txt + adding foo/bar/abc (glob) + $ hg ci -m 'dir commit with only normal file deltas' foo/bar + $ hg status + A a.dat + A a.txt + +Test a directory commit with a changed largefile and a changed normal file + $ echo changed > foo/bar/large.dat + $ echo changed > foo/bar/abc + $ hg ci -m 'dir commit with normal and lf file deltas' foo + $ hg status + A a.dat + A a.txt $ cd ..