filterfiles was failing to find files for directory arguments if
another file existed that started with the directory name and
sorted earlier. For example, a manifest of ('foo.h', 'foo/foo')
would cause filterfiles('foo') to return nothing. This resolves
issue #294.
Reference: http://www.selenic.com/mercurial/bts/issue166
If the [ui] section of .hgrc contains keys like "ignore" or
"ignore.something", the values corresponding to these keys are
treated as per-user hgignore files. These hgignore files apply to all
repositories used by that user.
On 11/15/05, Robin Farine <robin.farine@terminus.org> wrote:
> # HG changeset patch
> # User Robin Farine <robin.farine@terminus.org>
> # Node ID ce0a3cc309a8d1e81278ec01a3c61fbb99c691f4
> # Parent feb77e0951e74d75c213e8471f107fdcc124c876
> remove walk warning about nonexistent files
>
> diff -r feb77e0951e7 -r ce0a3cc309a8 mercurial/dirstate.py
> --- a/mercurial/dirstate.py Tue Nov 15 08:42:45 2005 +0100
> +++ b/mercurial/dirstate.py Tue Nov 15 08:59:50 2005 +0100
> @@ -336,9 +336,6 @@
> try:
> st = os.lstat(f)
> except OSError, inst:
> - if ff not in dc: self.ui.warn('%s: %s\n' % (
> - util.pathto(self.getcwd(), ff),
> - inst.strerror))
> continue
> if stat.S_ISDIR(st.st_mode):
> cmp1 = (lambda x, y: cmp(x[1], y[1]))
this break some tests,
a better fix would be to check if ff can be a directory prefix from files in dc
you can try the attached patch.
Benoit
The ''seen'' dictionary stores paths in canonical form,
so the walkhelp must also provide paths in that form,
otherwise the changed files are listed twice.
- add a dirstate.lazyread function that read only if it wasn't read before and
update all callers
- use the atomic keyword from util.opener to atomically write the dirstate
mercurial/dirstate.py
if a file was of unsupported type, it was considered as 'seen' while
walking. this way it was possible to have file in the dirstate not
yielded by the walk function.
Do a second walking pass to examine any leftover files in the dirstate
map that are in the .hgignore file but match our search criteria.
This fixes the case of entire directories never being examined due to
their presence in the .hgignore file, and should hopefully not add any
significant overhead.
Here is the new syntax, in summary.
Trailing white space is dropped.
The escape character is "\".
Comments start with #.
Empty lines are skipped.
Lines can be of the following formats:
syntax: regexp # defaults following lines to non-rooted regexps
syntax: glob # defaults following lines to non-rooted globs
re:pattern # non-rooted regular expression
glob:pattern # non-rooted glob
pattern # pattern of the current default type
The default pattern type is regexp, which is completely backwards
compatible with the old hgignore syntax.
In the dirstate class, the ignore method has been reworked to be based
on the util.matcher function, by way of a new dirstate.hgignore
method.
This generally cuts the time for hg status/diff in half, from 2s down to 1s.
The main parts I'm trying to optimize are:
1) os.walk stats every file. dirstate.changes then stats every file again.
2) os.walk yields every file and subdir to dirstate.traverse who yields every
file and everything in the dirstate map. dirstate.walk then
filters this mass and yields every file to the caller. There should be
fewer steps in here, and fewer duplicate strings yielded.
3) dirstate.walk runs util.unique on the results from dirstate.traverse,
even though it is also passing things through dirstate.seen to look for
duplicates.
I've turned os.walk into something hg specific that takes all the dirstate
ignore and matching rules into account. The new function also takes an
function arg (statmatch()) the caller supplies to help filter out
files it doesn't care about. dirstate.changes uses this to update state
for each file, avoiding the second stat call.
dirstate.walk is changed to turn the match function it is passed into
a statmatch function. The only real difference is that a statmatch
function takes the stat data as a second parameter. It now calls
dirstate.walkhelper, who requires a statmatch function to be passed.
This fails test-walk, but right now I think this is from a sorting error
fixed by this patch.
Index: crew/mercurial/dirstate.py
===================================================================
- delete copy information when we update dirstate
hg was keeping the copy state and marking things as copied on
multiple commits
- files that are renamed should have no parents
if you do a rename/copy to an existing file, it should not be marked
as descending from its previous revisions.
- remove spurious print from filelog.renamed
- add some more copy tests