Mercurial > hg
view tests/test-rebuildstate.t @ 45562:b51167d70f5a
rust: add `dirstate_tree` module
Mercurial needs to represent the filesystem hierarchy on which it operates, for
example in the dirstate. Its current on-disk representation is an unsorted, flat
structure that gets transformed in the current Rust code into a `HashMap`.
This loses the hierarchical information of the dirstate, leading to some
unfortunate performance and algorithmic compromises.
This module adds an implementation of a radix tree that is specialized for
representing the dirstate: its unit is the path component. I have made no
efforts to optimize either its memory footprint or its insertion speed: they're
pretty bad for now.
Following will be a few patches that modify the dirstate.status logic to use
that new hierarchical information, fixing issue 6335 in the same swing.
Differential Revision: https://phab.mercurial-scm.org/D9085
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Fri, 25 Sep 2020 17:51:34 +0200 |
parents | 7e99b02768ef |
children | ff82edadc2e1 |
line wrap: on
line source
$ cat > adddrop.py <<EOF > from mercurial import registrar > cmdtable = {} > command = registrar.command(cmdtable) > @command(b'debugadddrop', > [(b'', b'drop', False, b'drop file from dirstate', b'FILE'), > (b'', b'normal-lookup', False, b'add file to dirstate', b'FILE')], > b'hg debugadddrop') > def debugadddrop(ui, repo, *pats, **opts): > '''Add or drop unnamed arguments to or from the dirstate''' > drop = opts.get('drop') > nl = opts.get('normal_lookup') > if nl and drop: > raise error.Abort('drop and normal-lookup are mutually exclusive') > wlock = repo.wlock() > try: > for file in pats: > if opts.get('normal_lookup'): > repo.dirstate.normallookup(file) > else: > repo.dirstate.drop(file) > > repo.dirstate.write(repo.currenttransaction()) > finally: > wlock.release() > EOF $ echo "[extensions]" >> $HGRCPATH $ echo "debugadddrop=`pwd`/adddrop.py" >> $HGRCPATH basic test for hg debugrebuildstate $ hg init repo $ cd repo $ touch foo bar $ hg ci -Am 'add foo bar' adding bar adding foo $ touch baz $ hg add baz $ hg rm bar $ hg debugrebuildstate state dump after $ hg debugstate --no-dates | sort n 0 -1 unset bar n 0 -1 unset foo $ hg debugadddrop --normal-lookup file1 file2 $ hg debugadddrop --drop bar $ hg debugadddrop --drop $ hg debugstate --no-dates n 0 -1 unset file1 n 0 -1 unset file2 n 0 -1 unset foo $ hg debugrebuildstate status $ hg st -A ! bar ? baz C foo Test debugdirstate --minimal where a file is not in parent manifest but in the dirstate $ touch foo bar qux $ hg add qux $ hg remove bar $ hg status -A A qux R bar ? baz C foo $ hg debugadddrop --normal-lookup baz $ hg debugdirstate --no-dates r 0 0 * bar (glob) n 0 -1 * baz (glob) n 644 0 * foo (glob) a 0 -1 * qux (glob) $ hg debugrebuilddirstate --minimal $ hg debugdirstate --no-dates r 0 0 * bar (glob) n 644 0 * foo (glob) a 0 -1 * qux (glob) $ hg status -A A qux R bar ? baz C foo Test debugdirstate --minimal where file is in the parent manifest but not the dirstate $ hg manifest bar foo $ hg status -A A qux R bar ? baz C foo $ hg debugdirstate --no-dates r 0 0 * bar (glob) n 644 0 * foo (glob) a 0 -1 * qux (glob) $ hg debugadddrop --drop foo $ hg debugdirstate --no-dates r 0 0 * bar (glob) a 0 -1 * qux (glob) $ hg debugrebuilddirstate --minimal $ hg debugdirstate --no-dates r 0 0 * bar (glob) n 0 -1 * foo (glob) a 0 -1 * qux (glob) $ hg status -A A qux R bar ? baz C foo