graphlog: paths/-I/-X handling requires a new revset
The filtering logic of match objects cannot be reproduced with the existing
revsets as it operates at changeset files level. A changeset touching "a" and
"b" is matched by "-I a -X b" but not by "file(a) and not file(b)".
To solve this, a new internal "_matchfiles(...)" revset is introduced. It works
like "file(x)" but accepts more than one argument and its arguments are
prefixed with "p:", "i:" and "x:" to be used as patterns, include patterns or
exclude patterns respectively.
The _matchfiles revset is kept private for now:
- There are probably smarter ways to pass the arguments in a user-friendly way
- A "rev:" argument is likely appear at some point to emulate log command
behaviour with regard to filesets: they are evaluated for the parent revision
and applied everywhere instead of being reevaluated for each revision.
Corrupt an hg repo with two pulls.
create one repo with a long history
$ hg init source1
$ cd source1
$ touch foo
$ hg add foo
$ for i in 1 2 3 4 5 6 7 8 9 10; do
> echo $i >> foo
> hg ci -m $i
> done
$ cd ..
create a third repo to pull both other repos into it
$ hg init version2
$ hg -R version2 pull source1 &
$ sleep 1
pulling from source1
requesting all changes
adding changesets
adding manifests
adding file changes
added 10 changesets with 10 changes to 1 files
(run 'hg update' to get a working copy)
$ hg clone --pull -U version2 corrupted
requesting all changes
adding changesets
adding manifests
adding file changes
added 10 changesets with 10 changes to 1 files
$ wait
$ hg -R corrupted verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 10 changesets, 10 total revisions
$ hg -R version2 verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 10 changesets, 10 total revisions