aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-12-23 21:53:32 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-12-23 21:58:58 -0400
commit346c7a025780e011cdfdbb7eb27281f808a8de92 (patch)
tree3e8c9caef53105878f9378fbcd08e821ebe8540e
parent61b7f3dea3b54ead64cd5e957da28c83e7c25c85 (diff)
Avoid multiple calls to git ls-files when passed eg, "*".
-rw-r--r--Command.hs23
-rw-r--r--Core.hs2
-rw-r--r--GitRepo.hs50
-rw-r--r--Upgrade.hs2
-rw-r--r--debian/changelog1
5 files changed, 38 insertions, 40 deletions
diff --git a/Command.hs b/Command.hs
index 69b9dee9f..e30904d0f 100644
--- a/Command.hs
+++ b/Command.hs
@@ -107,14 +107,14 @@ isAnnexed file a = do
withFilesInGit :: SubCmdSeekStrings
withFilesInGit a params = do
repo <- Annex.gitRepo
- files <- liftIO $ mapM (Git.inRepo repo) params
- files' <- filterFiles $ foldl (++) [] files
+ files <- liftIO $ Git.inRepo repo params
+ files' <- filterFiles files
return $ map a files'
withAttrFilesInGit :: String -> SubCmdSeekAttrFiles
withAttrFilesInGit attr a params = do
repo <- Annex.gitRepo
- files <- liftIO $ mapM (Git.inRepo repo) params
- files' <- filterFiles $ foldl (++) [] files
+ files <- liftIO $ Git.inRepo repo params
+ files' <- filterFiles files
pairs <- liftIO $ Git.checkAttr repo attr files'
return $ map a pairs
withFilesMissing :: SubCmdSeekStrings
@@ -129,8 +129,8 @@ withFilesMissing a params = do
withFilesNotInGit :: SubCmdSeekBackendFiles
withFilesNotInGit a params = do
repo <- Annex.gitRepo
- newfiles <- liftIO $ mapM (Git.notInRepo repo) params
- newfiles' <- filterFiles $ foldl (++) [] newfiles
+ newfiles <- liftIO $ Git.notInRepo repo params
+ newfiles' <- filterFiles newfiles
backendPairs a newfiles'
withString :: SubCmdSeekStrings
withString a params = return [a $ unwords params]
@@ -139,21 +139,20 @@ withStrings a params = return $ map a params
withFilesToBeCommitted :: SubCmdSeekStrings
withFilesToBeCommitted a params = do
repo <- Annex.gitRepo
- tocommit <- liftIO $ mapM (Git.stagedFiles repo) params
- tocommit' <- filterFiles $ foldl (++) [] tocommit
+ tocommit <- liftIO $ Git.stagedFiles repo params
+ tocommit' <- filterFiles tocommit
return $ map a tocommit'
withFilesUnlocked :: SubCmdSeekBackendFiles
withFilesUnlocked = withFilesUnlocked' Git.typeChangedFiles
withFilesUnlockedToBeCommitted :: SubCmdSeekBackendFiles
withFilesUnlockedToBeCommitted = withFilesUnlocked' Git.typeChangedStagedFiles
-withFilesUnlocked' :: (Git.Repo -> FilePath -> IO [FilePath]) -> SubCmdSeekBackendFiles
+withFilesUnlocked' :: (Git.Repo -> [FilePath] -> IO [FilePath]) -> SubCmdSeekBackendFiles
withFilesUnlocked' typechanged a params = do
-- unlocked files have changed type from a symlink to a regular file
repo <- Annex.gitRepo
- typechangedfiles <- liftIO $ mapM (typechanged repo) params
+ typechangedfiles <- liftIO $ typechanged repo params
unlockedfiles <- liftIO $ filterM notSymlink $
- map (\f -> Git.workTree repo ++ "/" ++ f) $
- foldl (++) [] typechangedfiles
+ map (\f -> Git.workTree repo ++ "/" ++ f) typechangedfiles
unlockedfiles' <- filterFiles unlockedfiles
backendPairs a unlockedfiles'
withKeys :: SubCmdSeekStrings
diff --git a/Core.hs b/Core.hs
index 9da4f3f2e..d91595a04 100644
--- a/Core.hs
+++ b/Core.hs
@@ -204,6 +204,6 @@ getKeysPresent' dir = do
getKeysReferenced :: Annex [Key]
getKeysReferenced = do
g <- Annex.gitRepo
- files <- liftIO $ Git.inRepo g $ Git.workTree g
+ files <- liftIO $ Git.inRepo g [Git.workTree g]
keypairs <- mapM Backend.lookupFile files
return $ map fst $ catMaybes keypairs
diff --git a/GitRepo.hs b/GitRepo.hs
index 1ce6b8aec..122b5cc60 100644
--- a/GitRepo.hs
+++ b/GitRepo.hs
@@ -230,41 +230,39 @@ hPipeRead :: Repo -> [String] -> IO (PipeHandle, String)
hPipeRead repo params = assertLocal repo $ do
pipeFrom "git" (gitCommandLine repo params)
-{- Passed a location, recursively scans for all files that
- - are checked into git at that location. -}
-inRepo :: Repo -> FilePath -> IO [FilePath]
-inRepo repo l = pipeNullSplit repo
- ["ls-files", "--cached", "--exclude-standard", "-z", "--", l]
-
-{- Passed a location, recursively scans for all files that are not checked
- - into git, and not gitignored. -}
-notInRepo :: Repo -> FilePath -> IO [FilePath]
-notInRepo repo l = pipeNullSplit repo
- ["ls-files", "--others", "--exclude-standard", "-z", "--", l]
-
-{- Passed a location, returns a list of the files, staged for
- - commit, that are being added, moved, or changed (but not deleted). -}
-stagedFiles :: Repo -> FilePath -> IO [FilePath]
-stagedFiles repo l = pipeNullSplit repo
+{- Scans for files that are checked into git at the specified locations. -}
+inRepo :: Repo -> [FilePath] -> IO [FilePath]
+inRepo repo l = pipeNullSplit repo $
+ ["ls-files", "--cached", "--exclude-standard", "-z", "--"] ++ l
+
+{- Scans for files at the specified locations that are not checked into git,
+ - and not gitignored. -}
+notInRepo :: Repo -> [FilePath] -> IO [FilePath]
+notInRepo repo l = pipeNullSplit repo $
+ ["ls-files", "--others", "--exclude-standard", "-z", "--"] ++ l
+
+{- Returns a list of the files, staged for commit, that are being added,
+ - moved, or changed (but not deleted), from the specified locations. -}
+stagedFiles :: Repo -> [FilePath] -> IO [FilePath]
+stagedFiles repo l = pipeNullSplit repo $
["diff", "--cached", "--name-only", "--diff-filter=ACMRT", "-z",
- "--", l]
+ "--"] ++ l
-{- Passed a location, returns a list of the files, staged for
- - commit, whose type has changed. -}
-typeChangedStagedFiles :: Repo -> FilePath -> IO [FilePath]
+{- Returns a list of the files in the specified locations that are staged
+ - for commit, and whose type has changed. -}
+typeChangedStagedFiles :: Repo -> [FilePath] -> IO [FilePath]
typeChangedStagedFiles repo l = typeChangedFiles' repo l ["--cached"]
-{- Passed a location, returns a list of the files whose type has changed.
- - Files only staged for commit will not be included. -}
-typeChangedFiles :: Repo -> FilePath -> IO [FilePath]
+{- Returns a list of the files in the specified locations whose type has
+ - changed. Files only staged for commit will not be included. -}
+typeChangedFiles :: Repo -> [FilePath] -> IO [FilePath]
typeChangedFiles repo l = typeChangedFiles' repo l []
-typeChangedFiles' :: Repo -> FilePath -> [String] -> IO [FilePath]
+typeChangedFiles' :: Repo -> [FilePath] -> [String] -> IO [FilePath]
typeChangedFiles' repo l middle = pipeNullSplit repo $ start ++ middle ++ end
where
start = ["diff", "--name-only", "--diff-filter=T", "-z"]
- end = ["--", l]
-
+ end = ["--"] ++ l
{- Reads null terminated output of a git command (as enabled by the -z
- parameter), and splits it into a list of files. -}
diff --git a/Upgrade.hs b/Upgrade.hs
index 204e2d555..2e1708439 100644
--- a/Upgrade.hs
+++ b/Upgrade.hs
@@ -44,7 +44,7 @@ upgradeFrom0 = do
_ <- mapM (\k -> moveAnnex k $ olddir ++ "/" ++ keyFile k) keys
-- update the symlinks to the files
- files <- liftIO $ Git.inRepo g $ Git.workTree g
+ files <- liftIO $ Git.inRepo g [Git.workTree g]
fixlinks files
Annex.queueRun
diff --git a/debian/changelog b/debian/changelog
index ae6c3f046..bddd256ae 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,7 @@ git-annex (0.14) UNRELEASED; urgency=low
* Bugfix to git annex unused in a repository with nothing yet annexed.
* Support upgrading from a v0 annex with nothing in it.
+ * Avoid multiple calls to git ls-files when passed eg, "*".
-- Joey Hess <joeyh@debian.org> Mon, 20 Dec 2010 14:54:49 -0400