summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-03-26 14:02:35 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-03-26 14:02:35 -0400
commite4c72d1a1e0dca1612ff1b24d5afd058d3adc9b6 (patch)
treecb52ba10b7f698c1be71e2aa19b02c89d6e921d1
parent8e377f1ea3471f7c0af3435ba801cb805bf646d2 (diff)
assistant: Committing a whole lot of files at once could overflow command-line length limits and cause the commit to fail. This only happened when using the assistant in an indirect mode repository.
-rw-r--r--Assistant/Threads/Committer.hs8
-rw-r--r--debian/changelog3
-rw-r--r--doc/bugs/assistant_committer_crash_on_OSX_when_adding_lots_of_files.mdwn12
3 files changed, 21 insertions, 2 deletions
diff --git a/Assistant/Threads/Committer.hs b/Assistant/Threads/Committer.hs
index 8fecc1c51..2951a8018 100644
--- a/Assistant/Threads/Committer.hs
+++ b/Assistant/Threads/Committer.hs
@@ -290,8 +290,12 @@ handleAdds havelsof delayadd cs = returnWhen (null incomplete) $ do
-- files. The ls-files is run on a batch of files.
findnew [] = return ([], noop)
findnew pending@(exemplar:_) = do
- (newfiles, cleanup) <- liftAnnex $
- inRepo (Git.LsFiles.notInRepo False $ map changeFile pending)
+ let segments = segmentXargs $ map changeFile pending
+ rs <- liftAnnex $ forM segments $ \fs ->
+ inRepo (Git.LsFiles.notInRepo False fs)
+ let (newfiles, cleanup) = foldl'
+ (\(l1, a1) (l2, a2) -> (l1 ++ l2, a1 >> a2))
+ ([], return True) rs
-- note: timestamp info is lost here
let ts = changeTime exemplar
return (map (PendingAddChange ts) newfiles, void $ liftIO cleanup)
diff --git a/debian/changelog b/debian/changelog
index 79810d546..c41a3c0b5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -14,6 +14,9 @@ git-annex (5.20150318) UNRELEASED; urgency=medium
command that ignored it.)
* Improve error message when --in @date is used and there is no
reflog for the git-annex branch.
+ * assistant: Committing a whole lot of files at once could overflow
+ command-line length limits and cause the commit to fail. This
+ only happened when using the assistant in an indirect mode repository.
-- Joey Hess <id@joeyh.name> Thu, 19 Mar 2015 17:05:32 -0400
diff --git a/doc/bugs/assistant_committer_crash_on_OSX_when_adding_lots_of_files.mdwn b/doc/bugs/assistant_committer_crash_on_OSX_when_adding_lots_of_files.mdwn
index fd5242fdf..9fa44710c 100644
--- a/doc/bugs/assistant_committer_crash_on_OSX_when_adding_lots_of_files.mdwn
+++ b/doc/bugs/assistant_committer_crash_on_OSX_when_adding_lots_of_files.mdwn
@@ -8,3 +8,15 @@ long)
</pre>
Probably need to tune the command length limit for !linux. --[[Joey]]
+
+> Investigation suggests this is the problem:
+
+ inRepo (Git.LsFiles.notInRepo False $ map changeFile pending)
+
+> If a lot of new files have been added, the `pending` list can be
+> arbitrarily large, and this passes it to git ls-files as parameters.a
+>
+> It's not the actual commit that fails; that uses Git.Queue and xargs.
+> --[[Joey]]
+
+>> [[fixed|done]] --[[Joey]]