mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 00:45:18 +03:00
016e1e5ef8
Updating dirstate by simply adding and dropping files from self._map doesn't keep the other maps updated (think: _dirs, _copymap, _foldmap, _nonormalset) thus introducing cache inconsistency. This is also affecting the debugstate tests since now we don't even try to set correct mode and mtime for the files because they are marked dirty anyway and will be checked during next status call.
126 lines
2.8 KiB
Perl
126 lines
2.8 KiB
Perl
|
|
$ cat > adddrop.py <<EOF
|
|
> from mercurial import cmdutil
|
|
> cmdtable = {}
|
|
> command = cmdutil.command(cmdtable)
|
|
> @command('debugadddrop',
|
|
> [('', 'drop', False, 'drop file from dirstate', 'FILE'),
|
|
> ('', 'normal-lookup', False, 'add file to dirstate', 'FILE')],
|
|
> '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 --nodates | 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 --nodates
|
|
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 --nodates
|
|
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 --nodates
|
|
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 --nodates
|
|
r 0 0 * bar (glob)
|
|
n 644 0 * foo (glob)
|
|
a 0 -1 * qux (glob)
|
|
$ hg debugadddrop --drop foo
|
|
$ hg debugdirstate --nodates
|
|
r 0 0 * bar (glob)
|
|
a 0 -1 * qux (glob)
|
|
$ hg debugrebuilddirstate --minimal
|
|
$ hg debugdirstate --nodates
|
|
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
|
|
|