dirstate-item: change the internal storage and constructor value
This should be closer to what we do need and what we can actually reliably
record.
In practice it means that we abandon the prospect of storing much more refined
data for now. We don't have the necessary information nor code using it right
now. So it seems safer to just use a clearer version of what we had so far.
See the documentation changes for details.
Differential Revision: https://phab.mercurial-scm.org/D11557
$ 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'):
> with repo.dirstate.parentchange():
> repo.dirstate.update_file(
> file,
> p1_tracked=True,
> wc_tracked=True,
> possibly_dirty=True,
> )
> else:
> repo.dirstate._map.reset_state(file)
> repo.dirstate._dirty = True
>
> 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