Mercurial > hg
view tests/test-remotefilelog-sparse.t @ 45375:8c466bcb0879
revert: remove dangerous `parents` argument from `cmdutil.revert()`
As we found out the hard way (thanks to spectral@ for figuring it
out!), `cmdutil.revert()`'s `parents` argument must be
`repo.dirstate.parents()` or things may go wrong. We had an extension
that passed in the target commit as the first parent. The `hg split`
command from the evolve extension seems to have made the same mistake,
but I haven't looked carefully.
The problem is that `cmdutil._performrevert()` calls
`dirstate.normal()` on reverted files if the commit to revert to
equals the first parent. So if you pass in `ctx=foo` and
`parents=(foo.node(), nullid)`, then `dirstate.normal()` will be
called for the revert files, even though they might not be clean in
the working copy.
There doesn't seem to be any reason, other than a tiny performance
benefit, to passing the `parents` around instead of looking them up
again in `cmdutil._performrevert()`, so that's what this patch does.
Differential Revision: https://phab.mercurial-scm.org/D8925
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Mon, 10 Aug 2020 21:46:47 -0700 |
parents | d7304434390f |
children | f90a5c211251 |
line wrap: on
line source
#require no-windows $ . "$TESTDIR/remotefilelog-library.sh" $ hg init master $ cd master $ cat >> .hg/hgrc <<EOF > [remotefilelog] > server=True > EOF $ echo x > x $ echo z > z $ hg commit -qAm x1 $ echo x2 > x $ echo z2 > z $ hg commit -qAm x2 $ hg bookmark foo $ cd .. # prefetch a revision w/ a sparse checkout $ hgcloneshallow ssh://user@dummy/master shallow --noupdate streaming all changes 2 files to transfer, 527 bytes of data transferred 527 bytes in 0.* seconds (*/sec) (glob) searching for changes no changes found $ cd shallow $ printf "[extensions]\nsparse=\n" >> .hg/hgrc $ hg debugsparse -I x $ hg prefetch -r 0 1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over *s (glob) $ hg cat -r 0 x x $ hg debugsparse -I z $ hg prefetch -r 0 1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over *s (glob) $ hg cat -r 0 z z # prefetch sparse only on pull when configured $ printf "[remotefilelog]\npullprefetch=bookmark()\n" >> .hg/hgrc $ hg strip tip saved backup bundle to $TESTTMP/shallow/.hg/strip-backup/876b1317060d-b2e91d8d-backup.hg (glob) $ hg debugsparse --delete z $ clearcache $ hg pull pulling from ssh://user@dummy/master searching for changes adding changesets adding manifests adding file changes updating bookmark foo added 1 changesets with 0 changes to 0 files new changesets 876b1317060d (run 'hg update' to get a working copy) prefetching file contents 1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over *s (glob) # Dont consider filtered files when doing copy tracing ## Push an unrelated commit $ cd ../ $ hgcloneshallow ssh://user@dummy/master shallow2 streaming all changes 2 files to transfer, 527 bytes of data transferred 527 bytes in 0.* seconds (*) (glob) searching for changes no changes found updating to branch default 2 files updated, 0 files merged, 0 files removed, 0 files unresolved 1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over *s (glob) $ cd shallow2 $ printf "[extensions]\nsparse=\n" >> .hg/hgrc $ hg up -q 0 2 files fetched over 1 fetches - (2 misses, 0.00% hit ratio) over *s (glob) $ touch a $ hg ci -Aqm a $ hg push -q -f ## Pull the unrelated commit and rebase onto it - verify unrelated file was not pulled $ cd ../shallow $ hg up -q 1 $ hg pull -q $ hg debugsparse -I z $ clearcache $ hg prefetch -r '. + .^' -I x -I z 4 files fetched over 1 fetches - (4 misses, 0.00% hit ratio) over * (glob) $ hg rebase -d 2 --keep rebasing 1:876b1317060d "x2" (foo)