tests/test-walk.t
author Gregory Szorc <gregory.szorc@gmail.com>
Thu, 06 Sep 2018 14:04:46 -0700
changeset 39568 842cd0bdda75
parent 38475 67dc32d4e790
child 39707 5abc47d4ca6b
permissions -rw-r--r--
util: teach lrucachedict to enforce a max total cost Now that lrucachedict entries can have a numeric cost associated with them and we can easily pop the oldest item in the cache, it now becomes relatively trivial to implement support for enforcing a high water mark on the total cost of items in the cache. This commit teaches lrucachedict instances to have a max cost associated with them. When items are inserted, we pop old items until enough "cost" frees up to make room for the new item. This feature is close to zero cost when not used (modulo the insertion regressed introduced by the previous commit): $ ./hg perflrucachedict --size 4 --gets 1000000 --sets 1000000 --mixed 1000000 ! gets ! wall 0.607444 comb 0.610000 user 0.610000 sys 0.000000 (best of 17) ! wall 0.601653 comb 0.600000 user 0.600000 sys 0.000000 (best of 17) ! inserts ! wall 0.678261 comb 0.680000 user 0.680000 sys 0.000000 (best of 14) ! wall 0.685042 comb 0.680000 user 0.680000 sys 0.000000 (best of 15) ! sets ! wall 0.808770 comb 0.800000 user 0.800000 sys 0.000000 (best of 13) ! wall 0.834241 comb 0.830000 user 0.830000 sys 0.000000 (best of 12) ! mixed ! wall 0.782441 comb 0.780000 user 0.780000 sys 0.000000 (best of 13) ! wall 0.803804 comb 0.800000 user 0.800000 sys 0.000000 (best of 13) $ hg perflrucachedict --size 1000 --gets 1000000 --sets 1000000 --mixed 1000000 ! init ! wall 0.006952 comb 0.010000 user 0.010000 sys 0.000000 (best of 418) ! gets ! wall 0.613350 comb 0.610000 user 0.610000 sys 0.000000 (best of 17) ! wall 0.617415 comb 0.620000 user 0.620000 sys 0.000000 (best of 17) ! inserts ! wall 0.701270 comb 0.700000 user 0.700000 sys 0.000000 (best of 15) ! wall 0.700516 comb 0.700000 user 0.700000 sys 0.000000 (best of 15) ! sets ! wall 0.825720 comb 0.830000 user 0.830000 sys 0.000000 (best of 13) ! wall 0.837946 comb 0.840000 user 0.830000 sys 0.010000 (best of 12) ! mixed ! wall 0.821644 comb 0.820000 user 0.820000 sys 0.000000 (best of 13) ! wall 0.850559 comb 0.850000 user 0.850000 sys 0.000000 (best of 12) I reckon the slight slowdown on insert is due to added if checks. For caches with total cost limiting enabled: $ hg perflrucachedict --size 4 --gets 1000000 --sets 1000000 --mixed 1000000 --costlimit 100 ! gets w/ cost limit ! wall 0.598737 comb 0.590000 user 0.590000 sys 0.000000 (best of 17) ! inserts w/ cost limit ! wall 1.694282 comb 1.700000 user 1.700000 sys 0.000000 (best of 6) ! mixed w/ cost limit ! wall 1.157655 comb 1.150000 user 1.150000 sys 0.000000 (best of 9) $ hg perflrucachedict --size 1000 --gets 1000000 --sets 1000000 --mixed 1000000 --costlimit 10000 ! gets w/ cost limit ! wall 0.598526 comb 0.600000 user 0.600000 sys 0.000000 (best of 17) ! inserts w/ cost limit ! wall 37.838315 comb 37.840000 user 37.840000 sys 0.000000 (best of 3) ! mixed w/ cost limit ! wall 18.060198 comb 18.060000 user 18.060000 sys 0.000000 (best of 3) $ hg perflrucachedict --size 1000 --gets 1000000 --sets 1000000 --mixed 1000000 --costlimit 10000 --mixedgetfreq 90 ! gets w/ cost limit ! wall 0.600024 comb 0.600000 user 0.600000 sys 0.000000 (best of 17) ! inserts w/ cost limit ! wall 37.154547 comb 37.120000 user 37.120000 sys 0.000000 (best of 3) ! mixed w/ cost limit ! wall 4.381602 comb 4.380000 user 4.370000 sys 0.010000 (best of 3) The functions we're benchmarking are slightly different, which could move numbers by a few milliseconds. But the slowdown on insert is too great to be explained by that. The slowness is due to insert heavy operations needing to call popoldest() repeatedly when the cache is at capacity. The next commit will address this. Differential Revision: https://phab.mercurial-scm.org/D4503

  $ hg init t
  $ cd t
  $ mkdir -p beans
  $ for b in kidney navy turtle borlotti black pinto; do
  >     echo $b > beans/$b
  > done
  $ mkdir -p mammals/Procyonidae
  $ for m in cacomistle coatimundi raccoon; do
  >     echo $m > mammals/Procyonidae/$m
  > done
  $ echo skunk > mammals/skunk
  $ echo fennel > fennel
  $ echo fenugreek > fenugreek
  $ echo fiddlehead > fiddlehead
  $ hg addremove
  adding beans/black
  adding beans/borlotti
  adding beans/kidney
  adding beans/navy
  adding beans/pinto
  adding beans/turtle
  adding fennel
  adding fenugreek
  adding fiddlehead
  adding mammals/Procyonidae/cacomistle
  adding mammals/Procyonidae/coatimundi
  adding mammals/Procyonidae/raccoon
  adding mammals/skunk
  $ hg commit -m "commit #0"

  $ hg debugwalk -v
  * matcher:
  <alwaysmatcher>
  f  beans/black                     beans/black
  f  beans/borlotti                  beans/borlotti
  f  beans/kidney                    beans/kidney
  f  beans/navy                      beans/navy
  f  beans/pinto                     beans/pinto
  f  beans/turtle                    beans/turtle
  f  fennel                          fennel
  f  fenugreek                       fenugreek
  f  fiddlehead                      fiddlehead
  f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
  f  mammals/skunk                   mammals/skunk
  $ hg debugwalk -v -I.
  * matcher:
  <includematcher includes='(?:)'>
  f  beans/black                     beans/black
  f  beans/borlotti                  beans/borlotti
  f  beans/kidney                    beans/kidney
  f  beans/navy                      beans/navy
  f  beans/pinto                     beans/pinto
  f  beans/turtle                    beans/turtle
  f  fennel                          fennel
  f  fenugreek                       fenugreek
  f  fiddlehead                      fiddlehead
  f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
  f  mammals/skunk                   mammals/skunk

  $ cd mammals
  $ hg debugwalk -v
  * matcher:
  <alwaysmatcher>
  f  beans/black                     ../beans/black
  f  beans/borlotti                  ../beans/borlotti
  f  beans/kidney                    ../beans/kidney
  f  beans/navy                      ../beans/navy
  f  beans/pinto                     ../beans/pinto
  f  beans/turtle                    ../beans/turtle
  f  fennel                          ../fennel
  f  fenugreek                       ../fenugreek
  f  fiddlehead                      ../fiddlehead
  f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
  f  mammals/skunk                   skunk
  $ hg debugwalk -v -X ../beans
  * matcher:
  <differencematcher
    m1=<alwaysmatcher>,
    m2=<includematcher includes='(?:beans(?:/|$))'>>
  f  fennel                          ../fennel
  f  fenugreek                       ../fenugreek
  f  fiddlehead                      ../fiddlehead
  f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
  f  mammals/skunk                   skunk
  $ hg debugwalk -v -I '*k'
  * matcher:
  <includematcher includes='(?:mammals/[^/]*k(?:/|$))'>
  f  mammals/skunk  skunk
  $ hg debugwalk -v -I 'glob:*k'
  * matcher:
  <includematcher includes='(?:mammals/[^/]*k(?:/|$))'>
  f  mammals/skunk  skunk
  $ hg debugwalk -v -I 'relglob:*k'
  * matcher:
  <includematcher includes='(?:(?:|.*/)[^/]*k(?:/|$))'>
  f  beans/black    ../beans/black
  f  fenugreek      ../fenugreek
  f  mammals/skunk  skunk
  $ hg debugwalk -v -I 'relglob:*k' .
  * matcher:
  <intersectionmatcher
    m1=<patternmatcher patterns='(?:mammals(?:/|$))'>,
    m2=<includematcher includes='(?:(?:|.*/)[^/]*k(?:/|$))'>>
  f  mammals/skunk  skunk
  $ hg debugwalk -v -I 're:.*k$'
  * matcher:
  <includematcher includes='(?:.*k$)'>
  f  beans/black    ../beans/black
  f  fenugreek      ../fenugreek
  f  mammals/skunk  skunk
  $ hg debugwalk -v -I 'relre:.*k$'
  * matcher:
  <includematcher includes='(?:.*.*k$)'>
  f  beans/black    ../beans/black
  f  fenugreek      ../fenugreek
  f  mammals/skunk  skunk
  $ hg debugwalk -v -I 'path:beans'
  * matcher:
  <includematcher includes='(?:beans(?:/|$))'>
  f  beans/black     ../beans/black
  f  beans/borlotti  ../beans/borlotti
  f  beans/kidney    ../beans/kidney
  f  beans/navy      ../beans/navy
  f  beans/pinto     ../beans/pinto
  f  beans/turtle    ../beans/turtle
  $ hg debugwalk -v -I 'relpath:detour/../../beans'
  * matcher:
  <includematcher includes='(?:beans(?:/|$))'>
  f  beans/black     ../beans/black
  f  beans/borlotti  ../beans/borlotti
  f  beans/kidney    ../beans/kidney
  f  beans/navy      ../beans/navy
  f  beans/pinto     ../beans/pinto
  f  beans/turtle    ../beans/turtle

  $ hg debugwalk -v 'rootfilesin:'
  * matcher:
  <patternmatcher patterns='(?:[^/]+$)'>
  f  fennel      ../fennel
  f  fenugreek   ../fenugreek
  f  fiddlehead  ../fiddlehead
  $ hg debugwalk -v -I 'rootfilesin:'
  * matcher:
  <includematcher includes='(?:[^/]+$)'>
  f  fennel      ../fennel
  f  fenugreek   ../fenugreek
  f  fiddlehead  ../fiddlehead
  $ hg debugwalk -v 'rootfilesin:.'
  * matcher:
  <patternmatcher patterns='(?:[^/]+$)'>
  f  fennel      ../fennel
  f  fenugreek   ../fenugreek
  f  fiddlehead  ../fiddlehead
  $ hg debugwalk -v -I 'rootfilesin:.'
  * matcher:
  <includematcher includes='(?:[^/]+$)'>
  f  fennel      ../fennel
  f  fenugreek   ../fenugreek
  f  fiddlehead  ../fiddlehead
  $ hg debugwalk -v -X 'rootfilesin:'
  * matcher:
  <differencematcher
    m1=<alwaysmatcher>,
    m2=<includematcher includes='(?:[^/]+$)'>>
  f  beans/black                     ../beans/black
  f  beans/borlotti                  ../beans/borlotti
  f  beans/kidney                    ../beans/kidney
  f  beans/navy                      ../beans/navy
  f  beans/pinto                     ../beans/pinto
  f  beans/turtle                    ../beans/turtle
  f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
  f  mammals/skunk                   skunk
  $ hg debugwalk -v 'rootfilesin:fennel'
  * matcher:
  <patternmatcher patterns='(?:fennel/[^/]+$)'>
  $ hg debugwalk -v -I 'rootfilesin:fennel'
  * matcher:
  <includematcher includes='(?:fennel/[^/]+$)'>
  $ hg debugwalk -v 'rootfilesin:skunk'
  * matcher:
  <patternmatcher patterns='(?:skunk/[^/]+$)'>
  $ hg debugwalk -v -I 'rootfilesin:skunk'
  * matcher:
  <includematcher includes='(?:skunk/[^/]+$)'>
  $ hg debugwalk -v 'rootfilesin:beans'
  * matcher:
  <patternmatcher patterns='(?:beans/[^/]+$)'>
  f  beans/black     ../beans/black
  f  beans/borlotti  ../beans/borlotti
  f  beans/kidney    ../beans/kidney
  f  beans/navy      ../beans/navy
  f  beans/pinto     ../beans/pinto
  f  beans/turtle    ../beans/turtle
  $ hg debugwalk -v -I 'rootfilesin:beans'
  * matcher:
  <includematcher includes='(?:beans/[^/]+$)'>
  f  beans/black     ../beans/black
  f  beans/borlotti  ../beans/borlotti
  f  beans/kidney    ../beans/kidney
  f  beans/navy      ../beans/navy
  f  beans/pinto     ../beans/pinto
  f  beans/turtle    ../beans/turtle
  $ hg debugwalk -v 'rootfilesin:mammals'
  * matcher:
  <patternmatcher patterns='(?:mammals/[^/]+$)'>
  f  mammals/skunk  skunk
  $ hg debugwalk -v -I 'rootfilesin:mammals'
  * matcher:
  <includematcher includes='(?:mammals/[^/]+$)'>
  f  mammals/skunk  skunk
  $ hg debugwalk -v 'rootfilesin:mammals/'
  * matcher:
  <patternmatcher patterns='(?:mammals/[^/]+$)'>
  f  mammals/skunk  skunk
  $ hg debugwalk -v -I 'rootfilesin:mammals/'
  * matcher:
  <includematcher includes='(?:mammals/[^/]+$)'>
  f  mammals/skunk  skunk
  $ hg debugwalk -v -X 'rootfilesin:mammals'
  * matcher:
  <differencematcher
    m1=<alwaysmatcher>,
    m2=<includematcher includes='(?:mammals/[^/]+$)'>>
  f  beans/black                     ../beans/black
  f  beans/borlotti                  ../beans/borlotti
  f  beans/kidney                    ../beans/kidney
  f  beans/navy                      ../beans/navy
  f  beans/pinto                     ../beans/pinto
  f  beans/turtle                    ../beans/turtle
  f  fennel                          ../fennel
  f  fenugreek                       ../fenugreek
  f  fiddlehead                      ../fiddlehead
  f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     Procyonidae/raccoon

  $ hg debugwalk -v .
  * matcher:
  <patternmatcher patterns='(?:mammals(?:/|$))'>
  f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
  f  mammals/skunk                   skunk
  $ hg debugwalk -v -I.
  * matcher:
  <includematcher includes='(?:mammals(?:/|$))'>
  f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
  f  mammals/skunk                   skunk
  $ hg debugwalk -v Procyonidae
  * matcher:
  <patternmatcher patterns='(?:mammals/Procyonidae(?:/|$))'>
  f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     Procyonidae/raccoon

  $ cd Procyonidae
  $ hg debugwalk -v .
  * matcher:
  <patternmatcher patterns='(?:mammals/Procyonidae(?:/|$))'>
  f  mammals/Procyonidae/cacomistle  cacomistle
  f  mammals/Procyonidae/coatimundi  coatimundi
  f  mammals/Procyonidae/raccoon     raccoon
  $ hg debugwalk -v ..
  * matcher:
  <patternmatcher patterns='(?:mammals(?:/|$))'>
  f  mammals/Procyonidae/cacomistle  cacomistle
  f  mammals/Procyonidae/coatimundi  coatimundi
  f  mammals/Procyonidae/raccoon     raccoon
  f  mammals/skunk                   ../skunk
  $ cd ..

  $ hg debugwalk -v ../beans
  * matcher:
  <patternmatcher patterns='(?:beans(?:/|$))'>
  f  beans/black     ../beans/black
  f  beans/borlotti  ../beans/borlotti
  f  beans/kidney    ../beans/kidney
  f  beans/navy      ../beans/navy
  f  beans/pinto     ../beans/pinto
  f  beans/turtle    ../beans/turtle
  $ hg debugwalk -v .
  * matcher:
  <patternmatcher patterns='(?:mammals(?:/|$))'>
  f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
  f  mammals/skunk                   skunk
  $ hg debugwalk -v .hg
  abort: path 'mammals/.hg' is inside nested repo 'mammals'
  [255]
  $ hg debugwalk -v ../.hg
  abort: path contains illegal component: .hg
  [255]
  $ cd ..

  $ hg debugwalk -v -Ibeans
  * matcher:
  <includematcher includes='(?:beans(?:/|$))'>
  f  beans/black     beans/black
  f  beans/borlotti  beans/borlotti
  f  beans/kidney    beans/kidney
  f  beans/navy      beans/navy
  f  beans/pinto     beans/pinto
  f  beans/turtle    beans/turtle
  $ hg debugwalk -v -I '{*,{b,m}*/*}k'
  * matcher:
  <includematcher includes='(?:(?:[^/]*|(?:b|m)[^/]*/[^/]*)k(?:/|$))'>
  f  beans/black    beans/black
  f  fenugreek      fenugreek
  f  mammals/skunk  mammals/skunk
  $ hg debugwalk -v -Ibeans mammals
  * matcher:
  <intersectionmatcher
    m1=<patternmatcher patterns='(?:mammals(?:/|$))'>,
    m2=<includematcher includes='(?:beans(?:/|$))'>>
  $ hg debugwalk -v -Inon-existent
  * matcher:
  <includematcher includes='(?:non\\-existent(?:/|$))'>
  $ hg debugwalk -v -Inon-existent -Ibeans/black
  * matcher:
  <includematcher includes='(?:non\\-existent(?:/|$)|beans/black(?:/|$))'>
  f  beans/black  beans/black
  $ hg debugwalk -v -Ibeans beans/black
  * matcher:
  <intersectionmatcher
    m1=<patternmatcher patterns='(?:beans/black(?:/|$))'>,
    m2=<includematcher includes='(?:beans(?:/|$))'>>
  f  beans/black  beans/black  exact
  $ hg debugwalk -v -Ibeans/black beans
  * matcher:
  <intersectionmatcher
    m1=<patternmatcher patterns='(?:beans(?:/|$))'>,
    m2=<includematcher includes='(?:beans/black(?:/|$))'>>
  f  beans/black  beans/black
  $ hg debugwalk -v -Xbeans/black beans
  * matcher:
  <differencematcher
    m1=<patternmatcher patterns='(?:beans(?:/|$))'>,
    m2=<includematcher includes='(?:beans/black(?:/|$))'>>
  f  beans/borlotti  beans/borlotti
  f  beans/kidney    beans/kidney
  f  beans/navy      beans/navy
  f  beans/pinto     beans/pinto
  f  beans/turtle    beans/turtle
  $ hg debugwalk -v -Xbeans/black -Ibeans
  * matcher:
  <differencematcher
    m1=<includematcher includes='(?:beans(?:/|$))'>,
    m2=<includematcher includes='(?:beans/black(?:/|$))'>>
  f  beans/borlotti  beans/borlotti
  f  beans/kidney    beans/kidney
  f  beans/navy      beans/navy
  f  beans/pinto     beans/pinto
  f  beans/turtle    beans/turtle
  $ hg debugwalk -v -Xbeans/black beans/black
  * matcher:
  <differencematcher
    m1=<patternmatcher patterns='(?:beans/black(?:/|$))'>,
    m2=<includematcher includes='(?:beans/black(?:/|$))'>>
  $ hg debugwalk -v -Xbeans/black -Ibeans/black
  * matcher:
  <differencematcher
    m1=<includematcher includes='(?:beans/black(?:/|$))'>,
    m2=<includematcher includes='(?:beans/black(?:/|$))'>>
  $ hg debugwalk -v -Xbeans beans/black
  * matcher:
  <differencematcher
    m1=<patternmatcher patterns='(?:beans/black(?:/|$))'>,
    m2=<includematcher includes='(?:beans(?:/|$))'>>
  $ hg debugwalk -v -Xbeans -Ibeans/black
  * matcher:
  <differencematcher
    m1=<includematcher includes='(?:beans/black(?:/|$))'>,
    m2=<includematcher includes='(?:beans(?:/|$))'>>
  $ hg debugwalk -v 'glob:mammals/../beans/b*'
  * matcher:
  <patternmatcher patterns='(?:beans/b[^/]*$)'>
  f  beans/black     beans/black
  f  beans/borlotti  beans/borlotti
  $ hg debugwalk -v '-X*/Procyonidae' mammals
  * matcher:
  <differencematcher
    m1=<patternmatcher patterns='(?:mammals(?:/|$))'>,
    m2=<includematcher includes='(?:[^/]*/Procyonidae(?:/|$))'>>
  f  mammals/skunk  mammals/skunk
  $ hg debugwalk -v path:mammals
  * matcher:
  <patternmatcher patterns='(?:mammals(?:/|$))'>
  f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
  f  mammals/skunk                   mammals/skunk
  $ hg debugwalk -v ..
  abort: .. not under root '$TESTTMP/t'
  [255]
  $ hg debugwalk -v beans/../..
  abort: beans/../.. not under root '$TESTTMP/t'
  [255]
  $ hg debugwalk -v .hg
  abort: path contains illegal component: .hg
  [255]
  $ hg debugwalk -v beans/../.hg
  abort: path contains illegal component: .hg
  [255]
  $ hg debugwalk -v beans/../.hg/data
  abort: path contains illegal component: .hg/data
  [255]
  $ hg debugwalk -v beans/.hg
  abort: path 'beans/.hg' is inside nested repo 'beans'
  [255]

Test explicit paths and excludes:

  $ hg debugwalk -v fennel -X fennel
  * matcher:
  <differencematcher
    m1=<patternmatcher patterns='(?:fennel(?:/|$))'>,
    m2=<includematcher includes='(?:fennel(?:/|$))'>>
  $ hg debugwalk -v fennel -X 'f*'
  * matcher:
  <differencematcher
    m1=<patternmatcher patterns='(?:fennel(?:/|$))'>,
    m2=<includematcher includes='(?:f[^/]*(?:/|$))'>>
  $ hg debugwalk -v beans/black -X 'path:beans'
  * matcher:
  <differencematcher
    m1=<patternmatcher patterns='(?:beans/black(?:/|$))'>,
    m2=<includematcher includes='(?:beans(?:/|$))'>>
  $ hg debugwalk -v -I 'path:beans/black' -X 'path:beans'
  * matcher:
  <differencematcher
    m1=<includematcher includes='(?:beans/black(?:/|$))'>,
    m2=<includematcher includes='(?:beans(?:/|$))'>>

Test absolute paths:

  $ hg debugwalk -v `pwd`/beans
  * matcher:
  <patternmatcher patterns='(?:beans(?:/|$))'>
  f  beans/black     beans/black
  f  beans/borlotti  beans/borlotti
  f  beans/kidney    beans/kidney
  f  beans/navy      beans/navy
  f  beans/pinto     beans/pinto
  f  beans/turtle    beans/turtle
  $ hg debugwalk -v `pwd`/..
  abort: $TESTTMP/t/.. not under root '$TESTTMP/t'
  [255]

Test patterns:

  $ hg debugwalk -v glob:\*
  * matcher:
  <patternmatcher patterns='(?:[^/]*$)'>
  f  fennel      fennel
  f  fenugreek   fenugreek
  f  fiddlehead  fiddlehead
#if eol-in-paths
  $ echo glob:glob > glob:glob
  $ hg addremove
  adding glob:glob
  warning: filename contains ':', which is reserved on Windows: 'glob:glob'
  $ hg debugwalk -v glob:\*
  * matcher:
  <patternmatcher patterns='(?:[^/]*$)'>
  f  fennel      fennel
  f  fenugreek   fenugreek
  f  fiddlehead  fiddlehead
  f  glob:glob   glob:glob
  $ hg debugwalk -v glob:glob
  * matcher:
  <patternmatcher patterns='(?:glob$)'>
  glob: $ENOENT$
  $ hg debugwalk -v glob:glob:glob
  * matcher:
  <patternmatcher patterns='(?:glob:glob$)'>
  f  glob:glob  glob:glob  exact
  $ hg debugwalk -v path:glob:glob
  * matcher:
  <patternmatcher patterns='(?:glob:glob(?:/|$))'>
  f  glob:glob  glob:glob  exact
  $ rm glob:glob
  $ hg addremove
  removing glob:glob
#endif

  $ hg debugwalk -v 'glob:**e'
  * matcher:
  <patternmatcher patterns='(?:.*e$)'>
  f  beans/turtle                    beans/turtle
  f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle

  $ hg debugwalk -v 're:.*[kb]$'
  * matcher:
  <patternmatcher patterns='(?:.*[kb]$)'>
  f  beans/black    beans/black
  f  fenugreek      fenugreek
  f  mammals/skunk  mammals/skunk

  $ hg debugwalk -v path:beans/black
  * matcher:
  <patternmatcher patterns='(?:beans/black(?:/|$))'>
  f  beans/black  beans/black  exact
  $ hg debugwalk -v path:beans//black
  * matcher:
  <patternmatcher patterns='(?:beans/black(?:/|$))'>
  f  beans/black  beans/black  exact

  $ hg debugwalk -v relglob:Procyonidae
  * matcher:
  <patternmatcher patterns='(?:(?:|.*/)Procyonidae$)'>
  $ hg debugwalk -v 'relglob:Procyonidae/**'
  * matcher:
  <patternmatcher patterns='(?:(?:|.*/)Procyonidae/.*$)'>
  f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
  $ hg debugwalk -v 'relglob:Procyonidae/**' fennel
  * matcher:
  <patternmatcher patterns='(?:(?:|.*/)Procyonidae/.*$|fennel(?:/|$))'>
  f  fennel                          fennel                          exact
  f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
  $ hg debugwalk -v beans 'glob:beans/*'
  * matcher:
  <patternmatcher patterns='(?:beans(?:/|$)|beans/[^/]*$)'>
  f  beans/black     beans/black
  f  beans/borlotti  beans/borlotti
  f  beans/kidney    beans/kidney
  f  beans/navy      beans/navy
  f  beans/pinto     beans/pinto
  f  beans/turtle    beans/turtle
  $ hg debugwalk -v 'glob:mamm**'
  * matcher:
  <patternmatcher patterns='(?:mamm.*$)'>
  f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
  f  mammals/skunk                   mammals/skunk
  $ hg debugwalk -v 'glob:mamm**' fennel
  * matcher:
  <patternmatcher patterns='(?:mamm.*$|fennel(?:/|$))'>
  f  fennel                          fennel                          exact
  f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
  f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
  f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
  f  mammals/skunk                   mammals/skunk
  $ hg debugwalk -v 'glob:j*'
  * matcher:
  <patternmatcher patterns='(?:j[^/]*$)'>
  $ hg debugwalk -v NOEXIST
  * matcher:
  <patternmatcher patterns='(?:NOEXIST(?:/|$))'>
  NOEXIST: * (glob)

#if fifo
  $ mkfifo fifo
  $ hg debugwalk -v fifo
  * matcher:
  <patternmatcher patterns='(?:fifo(?:/|$))'>
  fifo: unsupported file type (type is fifo)
#endif

  $ rm fenugreek
  $ hg debugwalk -v fenugreek
  * matcher:
  <patternmatcher patterns='(?:fenugreek(?:/|$))'>
  f  fenugreek  fenugreek  exact
  $ hg rm fenugreek
  $ hg debugwalk -v fenugreek
  * matcher:
  <patternmatcher patterns='(?:fenugreek(?:/|$))'>
  f  fenugreek  fenugreek  exact
  $ touch new
  $ hg debugwalk -v new
  * matcher:
  <patternmatcher patterns='(?:new(?:/|$))'>
  f  new  new  exact

  $ mkdir ignored
  $ touch ignored/file
  $ echo '^ignored$' > .hgignore
  $ hg debugwalk -v ignored
  * matcher:
  <patternmatcher patterns='(?:ignored(?:/|$))'>
  $ hg debugwalk -v ignored/file
  * matcher:
  <patternmatcher patterns='(?:ignored/file(?:/|$))'>
  f  ignored/file  ignored/file  exact

Test listfile and listfile0

  $ $PYTHON -c "open('listfile0', 'wb').write(b'fenugreek\0new\0')"
  $ hg debugwalk -v -I 'listfile0:listfile0'
  * matcher:
  <includematcher includes='(?:fenugreek(?:/|$)|new(?:/|$))'>
  f  fenugreek  fenugreek
  f  new        new
  $ $PYTHON -c "open('listfile', 'wb').write(b'fenugreek\nnew\r\nmammals/skunk\n')"
  $ hg debugwalk -v -I 'listfile:listfile'
  * matcher:
  <includematcher includes='(?:fenugreek(?:/|$)|new(?:/|$)|mammals/skunk(?:/|$))'>
  f  fenugreek      fenugreek
  f  mammals/skunk  mammals/skunk
  f  new            new

  $ cd ..
  $ hg debugwalk -v -R t t/mammals/skunk
  * matcher:
  <patternmatcher patterns='(?:mammals/skunk(?:/|$))'>
  f  mammals/skunk  t/mammals/skunk  exact
  $ mkdir t2
  $ cd t2
  $ hg debugwalk -v -R ../t ../t/mammals/skunk
  * matcher:
  <patternmatcher patterns='(?:mammals/skunk(?:/|$))'>
  f  mammals/skunk  ../t/mammals/skunk  exact
  $ hg debugwalk -v --cwd ../t mammals/skunk
  * matcher:
  <patternmatcher patterns='(?:mammals/skunk(?:/|$))'>
  f  mammals/skunk  mammals/skunk  exact

  $ cd ..

Test split patterns on overflow

  $ cd t
  $ echo fennel > overflow.list
  $ cat >> printnum.py <<EOF
  > from __future__ import print_function
  > for i in range(20000 // 100):
  >   print('x' * 100)
  > EOF
  $ $PYTHON printnum.py >> overflow.list
  $ echo fenugreek >> overflow.list
  $ hg debugwalk 'listfile:overflow.list' 2>&1 | egrep -v '^xxx'
  f  fennel     fennel     exact
  f  fenugreek  fenugreek  exact
  $ cd ..