comparison mercurial/cmdutil.py @ 23391:d8cdd46f426d

add: check for the existence of a file matched inexactly before adding it The change in 10697f29af2b created a problem on Windows and OS X: --- /usr/local/mercurial/tests/test-issue660.t +++ /usr/local/mercurial/tests/test-issue660.t.err @@ -47,6 +47,8 @@ Should succeed - shadow removed: $ hg add b + adding b/b + b/b does not exist! Prior to the failing 'hg add', the file 'b/b' was added and committed, then 'b' was recursively deleted from the filesystem, file 'b' was created and the delete was recorded with 'hg rm --after'. This add is attempting to record the existence of file 'b'. A filesystem that is not case sensitive prevents dirstate.walk() from skipping its step 3, and step 3 has the effect of inserting removed files into the walk list. The Linux code doesn't run through step 3, and didn't exhibit the problem. It's not clear why a non case sensitive filesystem triggers step 3, given that the path normalization occurs in step 2. Prior to 10697f29af2b, part of the check here was 'f not in repo.dirstate' instead of 'f not in wctx'. Files in the 'r' state are filtered out of context.__contains__() but not dirstate.__contains__(). Therefore the removed file name wasn't added to the list of files to add when checking against dirstate. That change was to allow removed files to be readded, but adding a file that doesn't exist is nonsensical. If the user specifies a missing file, it will be an exact match and will still fail.
author Matt Harbison <matt_harbison@yahoo.com>
date Wed, 19 Nov 2014 22:27:55 -0500
parents aa0a430d9c75
children b913c394386f
comparison
equal deleted inserted replaced
23390:6a3e38a173ec 23391:d8cdd46f426d
1982 abort, warn = scmutil.checkportabilityalert(ui) 1982 abort, warn = scmutil.checkportabilityalert(ui)
1983 if abort or warn: 1983 if abort or warn:
1984 cca = scmutil.casecollisionauditor(ui, abort, repo.dirstate) 1984 cca = scmutil.casecollisionauditor(ui, abort, repo.dirstate)
1985 for f in wctx.walk(match): 1985 for f in wctx.walk(match):
1986 exact = match.exact(f) 1986 exact = match.exact(f)
1987 if exact or not explicitonly and f not in wctx: 1987 if exact or not explicitonly and f not in wctx and repo.wvfs.exists(f):
1988 if cca: 1988 if cca:
1989 cca(f) 1989 cca(f)
1990 names.append(f) 1990 names.append(f)
1991 if ui.verbose or not exact: 1991 if ui.verbose or not exact:
1992 ui.status(_('adding %s\n') % match.rel(join(f))) 1992 ui.status(_('adding %s\n') % match.rel(join(f)))