summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Fraser Tweedale <frase@frase.id.au>2014-05-16 21:34:43 +1000
committerGravatar Joey Hess <joey@kitenet.net>2014-05-16 15:46:43 -0400
commit905eaa8cf73a52d92edcb62c17abb2ca9bed863e (patch)
tree17f00f9ae395502c992dcc4d989328f460057410
parenteefa96844ef813b5ef985ff2db361988047546db (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.hs5
-rw-r--r--Remote/Bup.hs5
-rw-r--r--Remote/Helper/Ssh.hs15
-rw-r--r--Types/GitConfig.hs2
-rw-r--r--doc/git-annex.mdwn8
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