diff options
author | Joey Hess <joeyh@joeyh.name> | 2017-02-17 15:21:39 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2017-02-17 15:21:52 -0400 |
commit | 2c74780d475a2c9e60d8bf4d222bec7e15ca9dd6 (patch) | |
tree | aab7ebc93be5e1533cbca8bfb8363df56fcd7e94 /Command/Sync.hs | |
parent | f3affee1f111886057a5cc3083b55bfafa50bae8 (diff) |
sync hack to make updateInstead work on eg FAT
sync: When syncing with a local repository located on a crippled
filesystem, run the post-receive hook there, since it wouldn't get run
otherwise. This makes pushing to repos on FAT-formatted removable drives
update them when receive.denyCurrentBranch=updateInstead.
Made Remote.Git export onLocal, which was cleaned up to not have so many
caveats about its use.
This commit was sponsored by Jeff Goeke-Smith on Patreon.
Diffstat (limited to 'Command/Sync.hs')
-rw-r--r-- | Command/Sync.hs | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/Command/Sync.hs b/Command/Sync.hs index 78a66a14a..0d5d46b2f 100644 --- a/Command/Sync.hs +++ b/Command/Sync.hs @@ -1,7 +1,7 @@ {- git-annex command - - Copyright 2011 Joachim Breitner <mail@joachim-breitner.de> - - Copyright 2011-2016 Joey Hess <id@joeyh.name> + - Copyright 2011-2017 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -} @@ -40,6 +40,7 @@ import qualified Git import qualified Remote.Git import Config import Config.GitConfig +import Config.Files import Annex.Wanted import Annex.Content import Command.Get (getKey') @@ -51,6 +52,7 @@ import Annex.AutoMerge import Annex.AdjustedBranch import Annex.Ssh import Annex.BloomFilter +import Annex.UpdateInstead import Utility.Bloom import Utility.OptParse @@ -377,14 +379,30 @@ pushRemote o remote (Just branch, _) = stopUnless (pure (pushOption o) <&&> need showOutput ok <- inRepoWithSshOptionsTo (Remote.repo remote) (Remote.gitconfig remote) $ pushBranch remote branch - unless ok $ do - warning $ unwords [ "Pushing to " ++ Remote.name remote ++ " failed." ] - showLongNote "(non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git config)" - return ok + if ok + then postpushupdate + else do + warning $ unwords [ "Pushing to " ++ Remote.name remote ++ " failed." ] + showLongNote "(non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git config)" + return ok where needpush | remoteAnnexReadOnly (Remote.gitconfig remote) = return False | otherwise = anyM (newer remote) [syncBranch branch, Annex.Branch.name] + -- Do updateInstead emulation for remotes on eg removable drives + -- formatted FAT, where the post-update hook won't run. + postpushupdate + | maybe False annexCrippledFileSystem (remoteGitConfig (Remote.gitconfig remote)) = + case Git.repoWorkTree (Remote.repo remote) of + Nothing -> return True + Just wt -> ifM (Remote.Git.onLocal remote needUpdateInsteadEmulation) + ( liftIO $ do + p <- readProgramFile + boolSystem' p [Param "post-receive"] + (\cp -> cp { cwd = Just wt }) + , return True + ) + | otherwise = return True {- Pushes a regular branch like master to a remote. Also pushes the git-annex - branch. |