darcs

Issue 1229 darcs repair relies on cache if it exists and breaks if it cannot find patches

Title darcs repair relies on cache if it exists and breaks if it cannot find patches
Priority bug Status resolved
Milestone Resolved in
Superseder Nosy List ckeen, darcs-devel, dmitry.kurochkin, kowey, mornfall, thorkilnaur
Assigned To
Topics

Created on 2008-11-14.10:52:03 by ckeen, last changed 2009-08-27.14:20:22 by admin.

Messages
msg6673 (view) Author: ckeen Date: 2008-11-14.10:52:00
While working on the shell_harness mess, kowey noticed a strange error with the
repair.sh test. Failed test output follows:

Running repair.sh ...                            failed.
Probable reason :
rm -rf temp1
mkdir temp1
cd temp1
darcs initialize
echo ALL ignore-times >> _darcs/prefs/defaults
echo A1 > foo
mkdir d
echo A2 > d/bar
darcs add foo
darcs add d
darcs add d/bar
darcs record -a -m AA -A x
Finished recording patch 'AA'
echo B > foo
darcs record -a -m BB -A x
Finished recording patch 'BB'
echo C > foo
darcs record -a -m CC -A x
Finished recording patch 'CC'

for i in _darcs/pristine*; do
  echo Empty the pristine directory: $i
  rm -rf $i
  mkdir $i
done
Empty the pristine directory: _darcs/pristine.hashed

darcs repair

darcs failed:  Couldn't fetch
`0000000002-12f37a8a84034d3e623d726fe10e5031f4df997ac13f4d5571b5a90c41fb84fe'
in subdir pristine.hashed from sources:

thisrepo:/here/eykk10/darcsImpl/unstable/tests-darcs-2.dir/temp1
cache:/here/eykk10/darcsImpl/unstable/tests-darcs-2.dir/.darcs/cache


This tests passes when we clean the cache beforehand. So the question remaining
for us is, why does a cache that does not contain what we expect matter in this
context?
msg6867 (view) Author: mornfall Date: 2008-12-22.20:09:57
Sort of looks like a problem with the repo being lazy? Dunno. I don't suppose 
you can check that?
msg7849 (view) Author: mornfall Date: 2009-05-27.18:49:39
The following patch updated the status of issue1229 to be resolved:

* Resolve issue1229: strictify checkPristineAgainstSlurpy. 
Ignore-this: 8d35ecced399c9e556f92949065dd505

The code in replayRepository' in Darcs.Repository.Repair relies on being able
to catch exceptions that arise while running checkPristineAgainstSlurpy.
Unfortunately, due to unsafeInterleaveIO used in the SlurpDirectory code, the
exception does not get thrown until after the `catchall` is out of scope,
ie. when the "is_same" condition is evaluated (a supposed pure value, but
unsafeInterleaveIO has introduced latent exceptions into the equation). Making
the return from checkPristineAgainstSlurpy strict (using $!) forces execution
of the interleaved IO and trips the exception in the right context.
History
Date User Action Args
2008-11-14 10:52:04ckeencreate
2008-12-22 20:09:59mornfallsetstatus: unread -> unknown
nosy: kowey, dagit, simon, thorkilnaur, dmitry.kurochkin, mornfall, ckeen
messages: + msg6867
2009-05-27 18:49:43mornfallsetstatus: unknown -> resolved
nosy: kowey, dagit, simon, thorkilnaur, dmitry.kurochkin, mornfall, ckeen
messages: + msg7849
2009-08-10 23:51:43adminsetnosy: - dagit
2009-08-25 17:34:34adminsetnosy: + darcs-devel, - simon
2009-08-27 14:20:22adminsetnosy: kowey, darcs-devel, thorkilnaur, dmitry.kurochkin, mornfall, ckeen