bundle2: don't assume ordering of heads checked after push
Usually, the heads will have the same ordering in handlecheckheads. Insisting
on the same ordering is however an unnecessary constraint that in some custom
cases can cause pushes to fail even though the actual heads didn't change. This
caused production issues for us in combination with the current version of
https://bitbucket.org/Unity-Technologies/hgwebcachingproxy/ .
$ 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 644 -1 set bar
n 644 -1 set 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 644 -1 set 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 644 -1 * foo (glob)
a 0 -1 * qux (glob)
$ hg status -A
A qux
R bar
? baz
C foo