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.
This commit is contained in:
Joey Hess 2017-02-03 14:31:17 -04:00
parent ed56dba868
commit b77903af48
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
6 changed files with 53 additions and 18 deletions

View file

@ -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

View file

@ -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,

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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