Optimize both pre-commit and lock subcommands.

isLocked was doing the expensive check before the cheap one. Let's not
fork git diff twice per file when committing, especially.

git diff is still run more than strictly necessary (ie, more than once)
if multiple unlocked files are being committed. But much better now.
This commit is contained in:
Joey Hess 2010-11-11 14:54:29 -04:00
parent 8a8987579f
commit dffe949963
3 changed files with 19 additions and 10 deletions

View file

@ -37,14 +37,16 @@ perform file = do
liftIO $ Git.run g ["checkout", "--", file] liftIO $ Git.run g ["checkout", "--", file]
return $ Just $ return True -- no cleanup needed return $ Just $ return True -- no cleanup needed
{- Checks if a file is unlocked for edit. {- Checks if a file is unlocked for edit. -}
-
- But, without the symlink to the annex, cannot tell for sure if the
- file was annexed before. So, check if git thinks the file's type has
- changed (from a symlink to a regular file). -}
isLocked :: FilePath -> Annex Bool isLocked :: FilePath -> Annex Bool
isLocked file = do isLocked file = do
-- check if it's a symlink first, as that's cheapest
s <- liftIO $ getSymbolicLinkStatus file
if (isSymbolicLink s)
then return True -- Symlinked files are always locked.
else do
-- Not a symlink, so see if the type has changed,
-- if so it is presumed to have been unlocked.
g <- Annex.gitRepo g <- Annex.gitRepo
typechanged <- liftIO $ Git.typeChangedFiles g file typechanged <- liftIO $ Git.typeChangedFiles g file
s <- liftIO $ getSymbolicLinkStatus file return $ not $ elem file typechanged
return $ (not $ elem file typechanged) || isSymbolicLink s

View file

@ -22,7 +22,7 @@ import qualified Command.Add
start :: SubCmdStartString start :: SubCmdStartString
start file = do start file = do
-- If a file is unlocked for edit, add its new content to the -- If a file is unlocked for edit, add its new content to the
-- annex, -} -- annex. -}
locked <- Command.Lock.isLocked file locked <- Command.Lock.isLocked file
when (not locked) $ do when (not locked) $ do
pairs <- Backend.chooseBackends [file] pairs <- Backend.chooseBackends [file]
@ -30,7 +30,8 @@ start file = do
unless (ok) $ do unless (ok) $ do
error $ "failed to add " ++ file ++ "; canceling commit" error $ "failed to add " ++ file ++ "; canceling commit"
-- git commit will have staged the file's content; -- git commit will have staged the file's content;
-- drop that and stage the symlink -- drop that and run command queued by Add.state to
-- stage the symlink
g <- Annex.gitRepo g <- Annex.gitRepo
liftIO $ Git.run g ["reset", "-q", "--", file] liftIO $ Git.run g ["reset", "-q", "--", file]
Annex.queueRun Annex.queueRun

6
debian/changelog vendored
View file

@ -1,3 +1,9 @@
git-annex (0.05) UNRELEASED; urgency=low
* Optimize both pre-commit and lock subcommands.
-- Joey Hess <joeyh@debian.org> Thu, 11 Nov 2010 14:52:05 -0400
git-annex (0.04) unstable; urgency=low git-annex (0.04) unstable; urgency=low
* Add unlock subcommand, which replaces the symlink with a copy of * Add unlock subcommand, which replaces the symlink with a copy of