inotify: fix issue1375, add a test.

The biggest problem was the data structure, which did not allow changing
a file into a directory or vice versa. This problem is fixed by 47d29dcb7266.

The walk() method also had an issue in this case:
 - we know 'path' as a directory. inotify server sleeps.
 - 'path' is deleted
 - 'path' is recreated as a file
 - the server catches up here, and see the deletion. it instantiates a scan(),
   which in its turn calls for walk(repo, path).
 - walk() then assumes that 'path' is a directory and calls os.listdir on it,
   which raises an OSError(errno.ENOTDIR)

Catch the error, and yield the file instead of the directory contents.
This commit is contained in:
Nicolas Dumazet 2009-07-13 16:49:05 +02:00
parent 839cb8fbc8
commit 2645ee079e
3 changed files with 26 additions and 1 deletions

View File

@ -89,7 +89,11 @@ def walk(repo, root):
yield fullpath, dirs, files
except OSError, err:
if err.errno not in walk_ignored_errors:
if err.errno == errno.ENOTDIR:
# fullpath was a directory, but has since been replaced
# by a file.
yield fullpath, dirs, files
elif err.errno not in walk_ignored_errors:
raise
return walkit(root, root == '')

View File

@ -35,4 +35,19 @@ cd dir
hg status .
cd ..
#issue 1375
#Testing that we can remove a folder and then add a file with the same name
echo % issue 1375
mkdir h
echo h > h/h
hg ci -Am t
hg rm h
echo h >h
hg add h
hg status
hg ci -m0
kill `cat hg.pid`

View File

@ -32,3 +32,9 @@ M dir/x
? hg.pid
M dir/x
M x
% issue 1375
adding h/h
adding hg.pid
removing h/h
A h
R h/h