diff --git a/CHANGELOG b/CHANGELOG index 83a5f23001..6c27eba9fb 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 e69790799b..581cad5620 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 b972697d78..fb25f2f26e 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 a6b7eb578d..dd29055b83 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 f0dce81143..e29698c4b8 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 2763de22da..63f58d9e49 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