summaryrefslogtreecommitdiff
path: root/Command
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-12-01 13:59:39 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-12-01 13:59:45 -0400
commit91bf77fae4e0645d466db01a9a45f6a380c933f7 (patch)
treea2e57e048dfb9c40edd6ae74d293ec92beb23eb1 /Command
parent05224f307e37aa51b8daa11ce2d2657e4b41bed3 (diff)
Avoid using git commit in direct mode, since in some situations it will read the full contents of files in the tree.
The assistant's commit code also always avoids git commit, for simplicity. Indirect mode sync still does a git commit -a to catch unstaged changes. Note that this means that direct mode sync no longer runs the pre-commit hook or any other hooks git commit might call. The git annex pre-commit hook action for direct mode is however explicitly run. (The assistant already ran git commit with hooks disabled, so no change there.)
Diffstat (limited to 'Command')
-rw-r--r--Command/PreCommit.hs24
-rw-r--r--Command/Sync.hs32
2 files changed, 25 insertions, 31 deletions
diff --git a/Command/PreCommit.hs b/Command/PreCommit.hs
index f10ac628e..eed2f491c 100644
--- a/Command/PreCommit.hs
+++ b/Command/PreCommit.hs
@@ -11,12 +11,7 @@ import Common.Annex
import Command
import qualified Command.Add
import qualified Command.Fix
-import qualified Git.DiffTree
-import qualified Git.Ref
-import Annex.CatFile
-import Annex.Content.Direct
-import Git.Sha
-import Git.FilePath
+import Annex.Direct
def :: [Command]
def = [command "pre-commit" paramPaths seek SectionPlumbing
@@ -39,19 +34,4 @@ startIndirect file = next $ do
next $ return True
startDirect :: [String] -> CommandStart
-startDirect _ = next $ do
- (diffs, clean) <- inRepo $ Git.DiffTree.diffIndex Git.Ref.headRef
- makeabs <- flip fromTopFilePath <$> gitRepo
- forM_ diffs (go makeabs)
- next $ liftIO clean
- where
- go makeabs diff = do
- withkey (Git.DiffTree.srcsha diff) (Git.DiffTree.srcmode diff) removeAssociatedFile
- withkey (Git.DiffTree.dstsha diff) (Git.DiffTree.dstmode diff) addAssociatedFile
- where
- withkey sha mode a = when (sha /= nullSha) $ do
- k <- catKey sha mode
- case k of
- Nothing -> noop
- Just key -> void $ a key $
- makeabs $ Git.DiffTree.file diff
+startDirect _ = next $ next $ preCommitDirect
diff --git a/Command/Sync.hs b/Command/Sync.hs
index c41f46f8a..14c79e99d 100644
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -103,19 +103,33 @@ syncRemotes rs = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted )
commit :: CommandStart
commit = next $ next $ ifM isDirect
( do
+ showStart "commit" ""
void stageDirect
- runcommit []
- , runcommit [Param "-a"]
- )
- where
- runcommit ps = do
+ void preCommitDirect
+ commitStaged commitmessage
+ , do
showStart "commit" ""
- showOutput
Annex.Branch.commit "update"
-- Commit will fail when the tree is clean, so ignore failure.
- let params = Param "commit" : ps ++
- [Param "-m", Param "git-annex automatic sync"]
- _ <- inRepo $ tryIO . Git.Command.runQuiet params
+ _ <- inRepo $ tryIO . Git.Command.runQuiet
+ [ Param "commit"
+ , Param "-a"
+ , Param "-m"
+ , Param commitmessage
+ ]
+ return True
+ )
+ where
+ commitmessage = "git-annex automatic sync"
+
+commitStaged :: String -> Annex Bool
+commitStaged commitmessage = go =<< inRepo Git.Branch.currentUnsafe
+ where
+ go Nothing = return False
+ go (Just branch) = do
+ parent <- inRepo $ Git.Ref.sha branch
+ void $ inRepo $ Git.Branch.commit False commitmessage branch
+ (maybe [] (:[]) parent)
return True
mergeLocal :: Maybe Git.Ref -> CommandStart