install a git-annex-shell shim script when the standalone OSX app runs

I put it in ~/.ssh/ because there's no reliable way to get it into PATH,
and OSX ssh doesn't even honor user's PATH by default.

authorized_keys generators will need to check if it's there. Not done yet.
This commit is contained in:
Joey Hess 2012-09-26 17:19:45 -04:00
parent be6b68402b
commit 9c4a23cab1
5 changed files with 62 additions and 25 deletions

View file

@ -7,26 +7,30 @@
module Assistant.Install where module Assistant.Install where
import Assistant.Common
import Assistant.Install.AutoStart
import Assistant.Ssh
import Locations.UserConfig import Locations.UserConfig
import Utility.FileMode
import Utility.OSX import Utility.OSX
import Utility.Path
import System.Posix.Env import System.Posix.Env
import System.Directory
{- The OSX git-annex.app does not have an installation process. {- The OSX git-annex.app does not have an installation process.
- So when it's run, it needs to set up autostarting of the assistant - So when it's run, it needs to set up autostarting of the assistant
- daemon, as well as writing the programFile. - daemon, as well as writing the programFile, and putting a
- git-annex-shell wrapper into ~/.ssh
- -
- Note that this is done every time it's started, so if the user moves - Note that this is done every time it's started, so if the user moves
- it around, the paths this sets up won't break. - it around, the paths this sets up won't break.
-} -}
ensureInstalled :: IO () ensureInstalled :: IO ()
ensureInstalled = do ensureInstalled = do
e <- getEnv "OSX_GIT_ANNEX_APP_PROGRAM" e <- getEnv "GIT_ANNEX_OSX_APP_BASE"
case e of case e of
Nothing -> return () Nothing -> return ()
Just program -> do Just base -> do
let program = base ++ "/bin/git-annex"
programfile <- programFile programfile <- programFile
createDirectoryIfMissing True (parentDir programfile) createDirectoryIfMissing True (parentDir programfile)
writeFile programfile program writeFile programfile program
@ -34,12 +38,19 @@ ensureInstalled = do
autostartfile <- userAutoStart autoStartLabel autostartfile <- userAutoStart autoStartLabel
installAutoStart program autostartfile installAutoStart program autostartfile
{- Installs an autostart plist file for OSX. -} {- This shim is only updated if it doesn't
installAutoStart :: FilePath -> FilePath -> IO () - already exist with the right content. This
installAutoStart command file = do - ensures that there's no race where it would have
createDirectoryIfMissing True (parentDir file) - worked, but is unavailable due to being updated. -}
writeFile file $ genOSXAutoStartFile autoStartLabel command sshdir <- sshDir
["assistant", "--autostart"] let shim = sshdir </> "git-annex-shell"
let content = unlines
autoStartLabel :: String [ "#!/bin/sh"
autoStartLabel = "com.branchable.git-annex.assistant" , "set -e"
, "exec", base </> "runshell" ++ " git-annex-shell \"$@\""
]
curr <- catchDefaultIO "" $ readFile shim
when (curr /= content) $ do
createDirectoryIfMissing True (parentDir shim)
writeFile shim content
modifyFileMode shim $ addModes [ownerExecuteMode]

View file

@ -0,0 +1,23 @@
{- Assistant OSX autostart file installation
-
- Copyright 2012 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Assistant.Install.AutoStart where
import Utility.OSX
import Utility.Path
import System.Directory
{- Installs an autostart plist file for OSX. -}
installAutoStart :: FilePath -> FilePath -> IO ()
installAutoStart command file = do
createDirectoryIfMissing True (parentDir file)
writeFile file $ genOSXAutoStartFile autoStartLabel command
["assistant", "--autostart"]
autoStartLabel :: String
autoStartLabel = "com.branchable.git-annex.assistant"

View file

@ -16,7 +16,7 @@ import Utility.Path
import Utility.Monad import Utility.Monad
import Locations.UserConfig import Locations.UserConfig
import Utility.OSX import Utility.OSX
import Assistant.OSX import Assistant.Install.AutoStart
import Control.Applicative import Control.Applicative
import System.Directory import System.Directory
@ -97,16 +97,19 @@ installOSXAppFile appdir appfile mcontent = do
setFileMode dest mode setFileMode dest mode
install :: FilePath -> IO () install :: FilePath -> IO ()
install = do install command = do
#ifdef darwin_HOST_OS #ifdef darwin_HOST_OS
writeOSXDesktop writeOSXDesktop command
#else #else
writeFDODesktop writeFDODesktop command
#endif #endif
unlessM isRoot $ do ifM isRoot
( return ()
, do
programfile <- inDestDir =<< programFile programfile <- inDestDir =<< programFile
createDirectoryIfMissing True (parentDir programfile) createDirectoryIfMissing True (parentDir programfile)
writeFile programfile command writeFile programfile command
)
main :: IO () main :: IO ()
main = getArgs >>= go main = getArgs >>= go

View file

@ -12,8 +12,8 @@ fi
# If this is a standalone app, set a variable that git-annex can use to # If this is a standalone app, set a variable that git-annex can use to
# install itself. # install itself.
if [ -e "$base/bin/git-annex" ]; then if [ -e "$base/bin/git-annex" ]; then
GIT_ANNEX_OSX_WEBAPP_PROGRAM="$base/bin/git-annex" GIT_ANNEX_OSX_APP_BASE="$base"
export OSX_GIT_ANNEX_APP_PROGRAM export GIT_ANNEX_OSX_APP_BASE
fi fi
"$base/runshell" git-annex webapp "$@" "$base/runshell" git-annex webapp "$@"

View file

@ -47,7 +47,7 @@ export GIT_EXEC_PATH
if [ "$1" ]; then if [ "$1" ]; then
cmd="$1" cmd="$1"
shift 1 shift 1
"$cmd" "$@" exec "$cmd" "$@"
else else
$SHELL $SHELL
fi fi