fastest way to collect filenames in working dir

Christian Ebert blacktrash at gmx.net
Wed Oct 17 03:32:15 CDT 2007


* Christian Ebert on Tuesday, October 16, 2007 at 17:07:27 +0200
> The code I have at the moment does what I want. But
> repo.walk(node, <args>) "selects" from manifest, which is then
> thrown away; and ATM I can't wrap my head around how to steal
> repo.walk for my purposes.
> 
> My code ATM looks like this:
> 
> def myfunc(ui, repo, expand, *pats, **opts):
>    cmdutil.bail_if_changed(repo)
>    wlock = lock = None
>    try:
>        wlock = repo.wlock()
>        lock = repo.lock()
>        files, match, anypats = cmdutil.matchpats(repo, pats, opts)
>        ctx = repo.changectx()
>        node = ctx.node()
>        man = ctx.manifest()
>        files = [f for src, f
>            in repo.walk(node=node, files=files, match=match)
>            if mymatcher(f) and not man.linkf(f)]
> ...
> 
> So myfunc takes filename(pattern)s and walkopts as arguments to
> "select" from manifest.keys(), matches the remaining filenames
> against mymatcher, and discards symbolic links.

This seems to work (until someone points out the flaws):

def myfunc(ui, repo, expand, *pats, **opts):
    cmdutil.bail_if_changed(repo)
    wlock = lock = None
    try:
        wlock = repo.wlock()
        lock = repo.lock()
        files, match, anypats = cmdutil.matchpats(repo, pats, opts)
        fdict = dict.fromkeys(files)
        fdict.pop('.', None)
        ctx = repo.changectx()
        node = ctx.node()
        man = ctx.manifest()
        mfiles = man.keys()
        mfiles.sort()
        files = []
        for mf in mfiles:
            for ff in fdict:
                if ff == mf or ff.startswith('%s/' % mf):
                    files.append(ff)
                    del fdict[ff]
                    break
            if not mf in files and match(mf):
                files.append(mf)
        files = [f for f in files if mymatcher(f) and not man.linkf(f)]
...

c
-- 
keyword extension for Mercurial (http://selenic.com/mercurial):
<http://www.blacktrash.org/hg/hgkeyword/> (0.9.2 backwards compatible)
Mercurial crew development repository + keyword extension:
<http://www.blacktrash.org/hg/hg-crew-keyword/>


More information about the Mercurial-devel mailing list