mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 07:17:55 +03:00
localrepo: always write the filtered phasecache when nodes are destroyed (issue3827)
When the strip command is run, it calls repo.destroyed, which in turn checks if we read _phasecache, and if we did calls filterunknown on it and flushes the changes immediately. But in some cases, nothing causes _phasecache to be read, so we miss out on this and the file remains the same on-disk. Then a call to invalidate comes, which should refresh _phasecache if it changed, but it didn't, so it keeps using the old one with the stripped revision which causes an IndexError. Test written by Yuya Nishihara.
This commit is contained in:
parent
29e4e195d6
commit
8e15165a57
@ -1416,7 +1416,6 @@ class localrepository(object):
|
||||
# removed. We can either remove phasecache from the filecache,
|
||||
# causing it to reload next time it is accessed, or simply filter
|
||||
# the removed nodes now and write the updated cache.
|
||||
if '_phasecache' in self._filecache:
|
||||
self._phasecache.filterunknown(self)
|
||||
self._phasecache.write()
|
||||
|
||||
|
@ -236,6 +236,27 @@ def hgignore(server):
|
||||
f.close()
|
||||
runcommand(server, ['status', '-i', '-u'])
|
||||
|
||||
def phasecacheafterstrip(server):
|
||||
readchannel(server)
|
||||
|
||||
# create new head, 5:731265503d86
|
||||
runcommand(server, ['update', '-C', '0'])
|
||||
f = open('a', 'ab')
|
||||
f.write('a\n')
|
||||
f.close()
|
||||
runcommand(server, ['commit', '-Am.', 'a'])
|
||||
runcommand(server, ['log', '-Gq'])
|
||||
|
||||
# make it public; draft marker moves to 4:7966c8e3734d
|
||||
runcommand(server, ['phase', '-p', '.'])
|
||||
runcommand(server, ['phase', '.']) # load _phasecache.phaseroots
|
||||
|
||||
# strip 1::4 outside server
|
||||
os.system('hg --config extensions.mq= strip 1')
|
||||
|
||||
# shouldn't raise "7966c8e3734d: no node!"
|
||||
runcommand(server, ['branches'])
|
||||
|
||||
if __name__ == '__main__':
|
||||
os.system('hg init')
|
||||
|
||||
@ -258,3 +279,4 @@ if __name__ == '__main__':
|
||||
check(rollback)
|
||||
check(branch)
|
||||
check(hgignore)
|
||||
check(phasecacheafterstrip)
|
||||
|
@ -164,3 +164,29 @@ testing hgignore:
|
||||
adding .hgignore
|
||||
runcommand status -i -u
|
||||
I ignored-file
|
||||
|
||||
testing phasecacheafterstrip:
|
||||
|
||||
runcommand update -C 0
|
||||
1 files updated, 0 files merged, 2 files removed, 0 files unresolved
|
||||
runcommand commit -Am. a
|
||||
created new head
|
||||
runcommand log -Gq
|
||||
@ 5:731265503d86
|
||||
|
|
||||
| o 4:7966c8e3734d
|
||||
| |
|
||||
| o 3:b9b85890c400
|
||||
| |
|
||||
| o 2:aef17e88f5f0
|
||||
| |
|
||||
| o 1:d3a0a68be6de
|
||||
|/
|
||||
o 0:eff892de26ec
|
||||
|
||||
runcommand phase -p .
|
||||
runcommand phase .
|
||||
5: public
|
||||
saved backup bundle to $TESTTMP/.hg/strip-backup/d3a0a68be6de-backup.hg
|
||||
runcommand branches
|
||||
default 1:731265503d86
|
||||
|
Loading…
Reference in New Issue
Block a user