summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-03-29 13:26:06 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-03-29 13:26:06 -0400
commit86c10bc681bb12936bc12c612d6a91096bc41f7b (patch)
tree5291fac68a6e2e505690e33a65a7575d28ee4eb9
parentc079545a6a3a85f92fbf592229b5f90dbb2da856 (diff)
git annex add in adjusted unlocked branch
Cached the current branch lookup just because it seems unnecessary overhead to run an extra git command per add to query the current branch.
-rw-r--r--Annex.hs2
-rw-r--r--Annex/AdjustedBranch.hs6
-rw-r--r--Annex/Ingest.hs24
-rw-r--r--doc/design/adjusted_branches.mdwn2
4 files changed, 29 insertions, 5 deletions
diff --git a/Annex.hs b/Annex.hs
index fe6802776..5ab2b748d 100644
--- a/Annex.hs
+++ b/Annex.hs
@@ -136,6 +136,7 @@ data AnnexState = AnnexState
, workers :: [Either AnnexState (Async AnnexState)]
, concurrentjobs :: Maybe Int
, keysdbhandle :: Maybe Keys.DbHandle
+ , cachedcurrentbranch :: Maybe Git.Branch
}
newState :: GitConfig -> Git.Repo -> AnnexState
@@ -182,6 +183,7 @@ newState c r = AnnexState
, workers = []
, concurrentjobs = Nothing
, keysdbhandle = Nothing
+ , cachedcurrentbranch = Nothing
}
{- Makes an Annex state object for the specified git repo.
diff --git a/Annex/AdjustedBranch.hs b/Annex/AdjustedBranch.hs
index 357e70e2f..b2ca7dbf6 100644
--- a/Annex/AdjustedBranch.hs
+++ b/Annex/AdjustedBranch.hs
@@ -12,6 +12,7 @@ module Annex.AdjustedBranch (
originalToAdjusted,
adjustedToOriginal,
fromAdjustedBranch,
+ getAdjustment,
enterAdjustedBranch,
updateAdjustedBranch,
propigateAdjustedCommits,
@@ -45,7 +46,7 @@ data Adjustment
| LockAdjustment
| HideMissingAdjustment
| ShowMissingAdjustment
- deriving (Show)
+ deriving (Show, Eq)
reverseAdjustment :: Adjustment -> Adjustment
reverseAdjustment UnlockAdjustment = LockAdjustment
@@ -122,6 +123,9 @@ adjustedToOriginal b
bs = fromRef b
prefixlen = length adjustedBranchPrefix
+getAdjustment :: Branch -> Maybe Adjustment
+getAdjustment = fmap fst . adjustedToOriginal
+
fromAdjustedBranch :: Branch -> OrigBranch
fromAdjustedBranch b = maybe b snd (adjustedToOriginal b)
diff --git a/Annex/Ingest.hs b/Annex/Ingest.hs
index b80f0e1e0..1bf1db146 100644
--- a/Annex/Ingest.hs
+++ b/Annex/Ingest.hs
@@ -35,6 +35,8 @@ import Logs.Location
import qualified Annex
import qualified Annex.Queue
import qualified Database.Keys
+import qualified Git
+import qualified Git.Branch
import Config
import Utility.InodeCache
import Annex.ReplaceFile
@@ -43,6 +45,7 @@ import Utility.CopyFile
import Utility.Touch
import Git.FilePath
import Annex.InodeSentinal
+import Annex.AdjustedBranch
import Control.Exception (IOException)
@@ -309,15 +312,32 @@ forceParams = ifM (Annex.getState Annex.force)
)
{- Whether a file should be added unlocked or not. Default is to not,
- - unless symlinks are not supported. annex.addunlocked can override that. -}
+ - unless symlinks are not supported. annex.addunlocked can override that.
+ - Also, when in an adjusted unlocked branch, always add files unlocked.
+ -}
addUnlocked :: Annex Bool
addUnlocked = isDirect <||>
(versionSupportsUnlockedPointers <&&>
((not . coreSymlinks <$> Annex.getGitConfig) <||>
- (annexAddUnlocked <$> Annex.getGitConfig)
+ (annexAddUnlocked <$> Annex.getGitConfig) <||>
+ (maybe False (\b -> getAdjustment b == Just UnlockAdjustment) <$> cachedCurrentBranch)
)
)
+cachedCurrentBranch :: Annex (Maybe Git.Branch)
+cachedCurrentBranch = maybe cache (return . Just)
+ =<< Annex.getState Annex.cachedcurrentbranch
+ where
+ cache :: Annex (Maybe Git.Branch)
+ cache = do
+ mb <- inRepo Git.Branch.currentUnsafe
+ case mb of
+ Nothing -> return Nothing
+ Just b -> do
+ Annex.changeState $ \s ->
+ s { Annex.cachedcurrentbranch = Just b }
+ return (Just b)
+
{- Adds a file to the work tree for the key, and stages it in the index.
- The content of the key may be provided in a temp file, which will be
- moved into place. -}
diff --git a/doc/design/adjusted_branches.mdwn b/doc/design/adjusted_branches.mdwn
index 4ef229e1d..3cf55d1de 100644
--- a/doc/design/adjusted_branches.mdwn
+++ b/doc/design/adjusted_branches.mdwn
@@ -301,5 +301,3 @@ into adjusted view worktrees.]
(locking will cause the commits to fail) and so the assistant
should not be running, or at least should have commits disabled
when entering it.
-* When the adjusted branch unlocks files, behave as if annex.addunlocked is
- set, so git annex add will add files unlocked.