summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2017-02-03 14:31:17 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2017-02-03 14:31:17 -0400
commitc438a610208b1914932980a26c0ab90fb544cd34 (patch)
tree1c204beae009ae2b5351f0eb4e865abef09545ba
parent4cded2bc85d530dd335738cb870daf3a2d4e4a2f (diff)
New annex.synccontent config setting
.. which can be set to true to make git annex sync default to --content. This may become the default at some point in the future. As well as being configuable by git config, it can be configured by git-annex config to control the default behavior in all clones of a repository. Had to add a separate --no-content switch to we can tell if it's been explicitly set, and should override annex.synccontent. If --content was the default, this complication would not be necessary. This commit was sponsored by Jake Vosloo on Patreon.
-rw-r--r--CHANGELOG7
-rw-r--r--Command/Sync.hs36
-rw-r--r--Types/GitConfig.hs5
-rw-r--r--doc/git-annex-config.mdwn11
-rw-r--r--doc/git-annex-sync.mdwn5
-rw-r--r--doc/git-annex.mdwn7
6 files changed, 53 insertions, 18 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 83a5f2300..6c27eba9f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,8 +7,11 @@ git-annex (6.20170102) UNRELEASED; urgency=medium
taken for --json.
* vicfg: Include the numcopies configuation.
* config: New command for storing configuration in the git-annex branch.
- * annex.autocommit can be configured via git-annex config, to control
- the default behavior in all clones of a repository.
+ * New annex.synccontent config setting, which can be set to true to make
+ git annex sync default to --content. This may become the default at
+ some point in the future. As well as being configuable by git config,
+ it can be configured by git-annex config to control the default
+ behavior in all clones of a repository.
* stack.yaml: Update to lts-7.18.
* Some optimisations to string splitting code.
* unused: When large files are checked right into git, avoid buffering
diff --git a/Command/Sync.hs b/Command/Sync.hs
index e69790799..581cad562 100644
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -70,6 +70,7 @@ data SyncOptions = SyncOptions
, pullOption :: Bool
, pushOption :: Bool
, contentOption :: Bool
+ , noContentOption :: Bool
, keyOptions :: Maybe KeyOptions
}
@@ -92,8 +93,13 @@ optParser desc = SyncOptions
<*> invertableSwitch "push" True
( help "avoid git pushes to remotes"
)
- <*> invertableSwitch "content" False
- ( help "also transfer file contents"
+ <*> switch
+ ( long "content"
+ <> help "transfer file contents"
+ )
+ <*> switch
+ ( long "no-content"
+ <> help "do not transfer file contents"
)
<*> optional parseAllOption
@@ -118,22 +124,24 @@ seek o = allowConcurrentOutput $ do
, map (withbranch . pullRemote o mergeConfig) gitremotes
, [ mergeAnnex ]
]
- when (contentOption o) $
- whenM (seekSyncContent o dataremotes) $
- -- Transferring content can take a while,
- -- and other changes can be pushed to the git-annex
- -- branch on the remotes in the meantime, so pull
- -- and merge again to avoid our push overwriting
- -- those changes.
- mapM_ includeCommandAction $ concat
- [ map (withbranch . pullRemote o mergeConfig) gitremotes
- , [ commitAnnex, mergeAnnex ]
- ]
+ whenM (shouldsynccontent <&&> seekSyncContent o dataremotes) $
+ -- Transferring content can take a while,
+ -- and other changes can be pushed to the git-annex
+ -- branch on the remotes in the meantime, so pull
+ -- and merge again to avoid our push overwriting
+ -- those changes.
+ mapM_ includeCommandAction $ concat
+ [ map (withbranch . pullRemote o mergeConfig) gitremotes
+ , [ commitAnnex, mergeAnnex ]
+ ]
void $ includeCommandAction $ withbranch pushLocal
-- Pushes to remotes can run concurrently.
mapM_ (commandAction . withbranch . pushRemote o) gitremotes
-
+ where
+ shouldsynccontent = pure (contentOption o)
+ <||> (pure (not (noContentOption o)) <&&> getGitConfigVal annexSyncContent)
+
type CurrBranch = (Maybe Git.Branch, Maybe Adjustment)
{- There may not be a branch checked out until after the commit,
diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs
index b972697d7..fb25f2f26 100644
--- a/Types/GitConfig.hs
+++ b/Types/GitConfig.hs
@@ -38,6 +38,7 @@ data Configurable a
| DefaultConfig a
-- ^ A default value is known, but not all config sources
-- have been read yet.
+ deriving (Show)
{- Main git-annex settings. Each setting corresponds to a git-config key
- such as annex.foo -}
@@ -57,6 +58,7 @@ data GitConfig = GitConfig
, annexHttpHeaders :: [String]
, annexHttpHeadersCommand :: Maybe String
, annexAutoCommit :: Configurable Bool
+ , annexSyncContent :: Configurable Bool
, annexDebug :: Bool
, annexWebOptions :: [String]
, annexQuviOptions :: [String]
@@ -105,6 +107,8 @@ extractGitConfig r = GitConfig
, annexHttpHeadersCommand = getmaybe (annex "http-headers-command")
, annexAutoCommit = configurable True $
getmaybebool (annex "autocommit")
+ , annexSyncContent = configurable False $
+ getmaybebool (annex "synccontent")
, annexDebug = getbool (annex "debug") False
, annexWebOptions = getwords (annex "web-options")
, annexQuviOptions = getwords (annex "quvi-options")
@@ -156,6 +160,7 @@ extractGitConfig r = GitConfig
mergeGitConfig :: GitConfig -> GitConfig -> GitConfig
mergeGitConfig gitconfig repoglobals = gitconfig
{ annexAutoCommit = merge annexAutoCommit
+ , annexSyncContent = merge annexSyncContent
}
where
merge f = case f gitconfig of
diff --git a/doc/git-annex-config.mdwn b/doc/git-annex-config.mdwn
index a6b7eb578..dd29055b8 100644
--- a/doc/git-annex-config.mdwn
+++ b/doc/git-annex-config.mdwn
@@ -32,6 +32,10 @@ These settings can be overridden on a per-repository basis using
Set to false to prevent the git-annex assistant and git-annex sync
from automatically committing changes to files in the repository.
+* `annex.synccontent`
+
+ Set to true to make git-annex sync default to syncing content.
+
# EXAMPLE
Suppose you want to prevent git annex sync from committing changes
@@ -40,7 +44,12 @@ repository. Then run:
git annex config --set annex.autocommit false
-If you change your mind, you can get back to the default behavior:
+If you want to override that in a partiticular clone, just use git config
+in the clone:
+
+ git config annex.autocommit true
+
+And to get back to the default behavior:
git annex config --unset annex.autocommit
diff --git a/doc/git-annex-sync.mdwn b/doc/git-annex-sync.mdwn
index f0dce8114..e29698c4b 100644
--- a/doc/git-annex-sync.mdwn
+++ b/doc/git-annex-sync.mdwn
@@ -62,7 +62,10 @@ by running "git annex sync" on the remote.
Normally, syncing does not transfer the contents of annexed files.
The --content option causes the content of files in the work tree
- to also be uploaded and downloaded as necessary.
+ to also be uploaded and downloaded as necessary.
+
+ The annex.synccontent configuration can be set to true to make content
+ be synced by default.
Normally this tries to get each annexed file in the work tree
that the local repository does not yet have, and then copies each
diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn
index 2763de22d..63f58d9e4 100644
--- a/doc/git-annex.mdwn
+++ b/doc/git-annex.mdwn
@@ -1009,6 +1009,13 @@ Here are all the supported configuration settings.
To configure the behavior in all clones of the repository,
this can be set in [[git-annex-config]].
+* `annex.synccontent`
+
+ Set to true to make git-annex sync default to syncing content.
+
+ To configure the behavior in all clones of the repository,
+ this can be set in [[git-annex-config]].
+
* `annex.startupscan`
Set to false to prevent the git-annex assistant from scanning the