diff options
author | Joey Hess <joey@kitenet.net> | 2012-02-25 16:11:47 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-02-25 16:18:55 -0400 |
commit | 1f73db3469e29448bcb1520893de11b23da6fb1f (patch) | |
tree | b16fe0b9552818d16067e7cbb7c3403b73fe5e94 /Annex/Branch.hs | |
parent | b49c0c2633d662a7c91a609aec74f95f189129ad (diff) |
improve alwayscommit=false mode
Now changes are staged into the branch's index, but not committed,
which avoids growing a large journal. And sync and merge always
explicitly commit, ensuring that even when they do nothing else,
they commit the staged changes.
Added a flag file to indicate that the branch's journal contains
uncommitted changes. (Could use git ls-files, but don't want to run
that every time.)
In the future, this ability to have uncommitted changes staged in the
journal might be used on remotes after a series of oneshot commands.
Diffstat (limited to 'Annex/Branch.hs')
-rw-r--r-- | Annex/Branch.hs | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/Annex/Branch.hs b/Annex/Branch.hs index acab417fb..52089ac97 100644 --- a/Annex/Branch.hs +++ b/Annex/Branch.hs @@ -18,6 +18,7 @@ module Annex.Branch ( get, change, commit, + stage, files, ) where @@ -114,14 +115,14 @@ updateTo pairs = do -- ensure branch exists, and get its current ref branchref <- getBranch -- check what needs updating before taking the lock - dirty <- journalDirty + dirty <- unCommitted (refs, branches) <- unzip <$> filterM isnewer pairs if not dirty && null refs then updateIndex branchref else withIndex $ lockJournal $ do when dirty stageJournal let merge_desc = if null branches - then "update" + then "update" else "merging " ++ unwords (map Git.Ref.describe branches) ++ " into " ++ show name @@ -182,11 +183,17 @@ set file content = do {- Stages the journal, and commits staged changes to the branch. -} commit :: String -> Annex () -commit message = whenM journalDirty $ lockJournal $ do +commit message = whenM unCommitted $ lockJournal $ do stageJournal ref <- getBranch withIndex $ commitBranch ref message [fullname] +{- Stages the journal, not making a commit to the branch. -} +stage :: Annex () +stage = whenM journalDirty $ lockJournal $ do + stageJournal + setUnCommitted + {- Commits the staged changes in the index to the branch. - - Ensures that the branch's index file is first updated to the state @@ -213,6 +220,7 @@ commitBranch branchref message parents = do parentrefs <- commitparents <$> catObject committedref when (racedetected branchref parentrefs) $ fixrace committedref parentrefs + setCommitted where -- look for "parent ref" lines and return the refs commitparents = map (Git.Ref . snd) . filter isparent . @@ -301,6 +309,25 @@ setIndexSha ref = do lock <- fromRepo gitAnnexIndexLock liftIO $ writeFile lock $ show ref ++ "\n" +{- Checks if there are uncommitted changes in the branch's index or journal. -} +unCommitted :: Annex Bool +unCommitted = do + d <- liftIO . doesFileExist =<< fromRepo gitAnnexIndexDirty + if d + then return d + else journalDirty + +setUnCommitted :: Annex () +setUnCommitted = do + file <- fromRepo gitAnnexIndexDirty + liftIO $ writeFile file "1" + +setCommitted :: Annex () +setCommitted = do + file <- fromRepo gitAnnexIndexDirty + _ <- liftIO $ tryIO $ removeFile file + return () + {- Stages the journal into the index. -} stageJournal :: Annex () stageJournal = do |