diff options
author | Fraser Tweedale <frase@frase.id.au> | 2014-05-16 21:34:43 +1000 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2014-05-16 15:46:43 -0400 |
commit | 905eaa8cf73a52d92edcb62c17abb2ca9bed863e (patch) | |
tree | 17f00f9ae395502c992dcc4d989328f460057410 | |
parent | eefa96844ef813b5ef985ff2db361988047546db (diff) |
execute remote.<name>.annex-shell on remote, if set
It is useful to be able to specify an alternative git-annex-shell
program to execute on the remote, e.g., to run a version not on the
PATH. Use remote.<name>.annex-shell if specified, instead of the
default "git-annex-shell" i.e., first so-named executable on the
PATH.
-rw-r--r-- | Command/Map.hs | 5 | ||||
-rw-r--r-- | Remote/Bup.hs | 5 | ||||
-rw-r--r-- | Remote/Helper/Ssh.hs | 15 | ||||
-rw-r--r-- | Types/GitConfig.hs | 2 | ||||
-rw-r--r-- | doc/git-annex.mdwn | 8 |
5 files changed, 26 insertions, 9 deletions
diff --git a/Command/Map.hs b/Command/Map.hs index 7c11fb2ef..81fa35d43 100644 --- a/Command/Map.hs +++ b/Command/Map.hs @@ -22,6 +22,7 @@ import Logs.UUID import Logs.Trust import qualified Remote.Helper.Ssh as Ssh import qualified Utility.Dot as Dot +import Types.GitConfig -- a link from the first repository to the second (its remote) data Link = Link Git.Repo Git.Repo @@ -203,7 +204,9 @@ tryScan r configlist = Ssh.onRemote r (pipedconfig, Nothing) "configlist" [] [] manualconfiglist = do - sshparams <- Ssh.toRepo r [Param sshcmd] + g <- fromRepo id + let c = extractRemoteGitConfig g (Git.repoDescribe r) + sshparams <- Ssh.toRepo r c [Param sshcmd] liftIO $ pipedconfig "ssh" sshparams where sshcmd = cddir ++ " && " ++ diff --git a/Remote/Bup.hs b/Remote/Bup.hs index 4e79eca42..afb1e78dd 100644 --- a/Remote/Bup.hs +++ b/Remote/Bup.hs @@ -13,6 +13,7 @@ import System.Process import Data.ByteString.Lazy.UTF8 (fromString) import Common.Annex +import Types.GitConfig import Types.Remote import Types.Key import Types.Creds @@ -223,7 +224,9 @@ storeBupUUID u buprepo = do onBupRemote :: Git.Repo -> (FilePath -> [CommandParam] -> IO a) -> FilePath -> [CommandParam] -> Annex a onBupRemote r a command params = do - sshparams <- Ssh.toRepo r [Param $ + g <- fromRepo id + let c = extractRemoteGitConfig g (Git.repoDescribe r) + sshparams <- Ssh.toRepo r c [Param $ "cd " ++ dir ++ " && " ++ unwords (command : toCommand params)] liftIO $ a "ssh" sshparams where diff --git a/Remote/Helper/Ssh.hs b/Remote/Helper/Ssh.hs index 6848f7212..745e9c025 100644 --- a/Remote/Helper/Ssh.hs +++ b/Remote/Helper/Ssh.hs @@ -26,10 +26,8 @@ import Config {- Generates parameters to ssh to a repository's host and run a command. - Caller is responsible for doing any neccessary shellEscaping of the - passed command. -} -toRepo :: Git.Repo -> [CommandParam] -> Annex [CommandParam] -toRepo r sshcmd = do - g <- fromRepo id - let c = extractRemoteGitConfig g (Git.repoDescribe r) +toRepo :: Git.Repo -> RemoteGitConfig -> [CommandParam] -> Annex [CommandParam] +toRepo r c sshcmd = do let opts = map Param $ remoteAnnexSshOptions c let host = fromMaybe (error "bad ssh url") $ Git.Url.hostuser r params <- sshCachingOptions (host, Git.Url.port r) opts @@ -41,16 +39,19 @@ git_annex_shell :: Git.Repo -> String -> [CommandParam] -> [(Field, String)] -> git_annex_shell r command params fields | not $ Git.repoIsUrl r = return $ Just (shellcmd, shellopts ++ fieldopts) | Git.repoIsSsh r = do + g <- fromRepo id + let c = extractRemoteGitConfig g (Git.repoDescribe r) u <- getRepoUUID r - sshparams <- toRepo r [Param $ sshcmd u ] + sshparams <- toRepo r c [Param $ sshcmd u c] return $ Just ("ssh", sshparams) | otherwise = return Nothing where dir = Git.repoPath r shellcmd = "git-annex-shell" shellopts = Param command : File dir : params - sshcmd u = unwords $ - shellcmd : map shellEscape (toCommand shellopts) ++ + sshcmd u c = unwords $ + fromMaybe shellcmd (remoteAnnexShell c) + : map shellEscape (toCommand shellopts) ++ uuidcheck u ++ map shellEscape (toCommand fieldopts) uuidcheck NoUUID = [] diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs index 71f06ff45..29a7c9019 100644 --- a/Types/GitConfig.hs +++ b/Types/GitConfig.hs @@ -119,6 +119,7 @@ data RemoteGitConfig = RemoteGitConfig {- These settings are specific to particular types of remotes - including special remotes. -} + , remoteAnnexShell :: Maybe String , remoteAnnexSshOptions :: [String] , remoteAnnexRsyncOptions :: [String] , remoteAnnexRsyncUploadOptions :: [String] @@ -151,6 +152,7 @@ extractRemoteGitConfig r remotename = RemoteGitConfig , remoteAnnexAvailability = getmayberead "availability" , remoteAnnexBare = getmaybebool "bare" + , remoteAnnexShell = getmaybe "shell" , remoteAnnexSshOptions = getoptions "ssh-options" , remoteAnnexRsyncOptions = getoptions "rsync-options" , remoteAnnexRsyncDownloadOptions = getoptions "rsync-download-options" diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index e2f662e64..8a2a3f7c6 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -1493,6 +1493,14 @@ Here are all the supported configuration settings. The command will only be run once *all* running git-annex processes are finished using the remote. +* `remote.<name>.annex-shell` + + Specify an alternative git-annex-shell executable on the remote + instead of looking for "git-annex-shell" on the PATH. + + This is useful if the git-annex-shell program is outside the PATH + or has a non-standard name. + * `remote.<name>.annex-ignore` If set to `true`, prevents git-annex |