standalone linux app nearly ready

also made several fixes that apply to the OSX app
This commit is contained in:
Joey Hess 2012-09-28 19:08:13 -04:00
parent f0d75cd928
commit e88e3ba85b
11 changed files with 187 additions and 20 deletions

View file

@ -5,6 +5,8 @@
- Licensed under the GNU GPL version 3 or higher.
-}
{-# LANGUAGE CPP #-}
module Assistant.Install where
import Assistant.Common
@ -12,14 +14,15 @@ import Assistant.Install.AutoStart
import Assistant.Ssh
import Locations.UserConfig
import Utility.FileMode
import Utility.FreeDesktop
import Utility.OSX
import System.Posix.Env
standaloneOSXAppBase :: IO (Maybe FilePath)
standaloneOSXAppBase = getEnv "GIT_ANNEX_OSX_APP_BASE"
standaloneAppBase :: IO (Maybe FilePath)
standaloneAppBase = getEnv "GIT_ANNEX_APP_BASE"
{- The OSX git-annex.app does not have an installation process.
{- The standalone app does not have an installation process.
- So when it's run, it needs to set up autostarting of the assistant
- daemon, as well as writing the programFile, and putting a
- git-annex-shell wrapper into ~/.ssh
@ -28,16 +31,21 @@ standaloneOSXAppBase = getEnv "GIT_ANNEX_OSX_APP_BASE"
- it around, the paths this sets up won't break.
-}
ensureInstalled :: IO ()
ensureInstalled = go =<< standaloneOSXAppBase
ensureInstalled = go =<< standaloneAppBase
where
go Nothing = noop
go (Just base) = do
let program = base ++ "/bin/git-annex"
let program = base ++ "runshell git-annex"
programfile <- programFile
createDirectoryIfMissing True (parentDir programfile)
writeFile programfile program
autostartfile <- userAutoStart autoStartLabel
#ifdef darwin_HOST_OS
autostartfile <- userAutoStart osxAutoStartLabel
#else
autostartfile <- autoStartPath "git-annex"
<$> userConfigDir
#endif
installAutoStart program autostartfile
{- This shim is only updated if it doesn't
@ -52,7 +60,7 @@ ensureInstalled = go =<< standaloneOSXAppBase
, "exec", base </> "runshell" ++
" git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\""
]
curr <- catchDefaultIO "" $ readFile shim
curr <- catchDefaultIO "" $ readFileStrict shim
when (curr /= content) $ do
createDirectoryIfMissing True (parentDir shim)
writeFile shim content

View file

@ -1,23 +1,37 @@
{- Assistant OSX autostart file installation
{- Assistant autostart file installation
-
- Copyright 2012 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
{-# LANGUAGE CPP #-}
module Assistant.Install.AutoStart where
import Utility.FreeDesktop
import Utility.OSX
import Utility.Path
import System.Directory
{- Installs an autostart plist file for OSX. -}
installAutoStart :: FilePath -> FilePath -> IO ()
installAutoStart command file = do
#ifdef darwin_HOST_OS
createDirectoryIfMissing True (parentDir file)
writeFile file $ genOSXAutoStartFile autoStartLabel command
writeFile file $ genOSXAutoStartFile osxAutoStartLabel command
["assistant", "--autostart"]
#else
writeDesktopMenuFile (fdoAutostart command) file
#endif
autoStartLabel :: String
autoStartLabel = "com.branchable.git-annex.assistant"
osxAutoStartLabel :: String
osxAutoStartLabel = "com.branchable.git-annex.assistant"
fdoAutostart :: FilePath -> DesktopEntry
fdoAutostart command = genDesktopEntry
"Git Annex Assistant"
"Autostart"
False
(command ++ " assistant --autostart")
[]

View file

@ -13,7 +13,7 @@ import Assistant.Common
import Assistant.WebApp
import Assistant.WebApp.Types
import Assistant.WebApp.SideBar
import Assistant.Install (standaloneOSXAppBase)
import Assistant.Install (standaloneAppBase)
import Utility.Yesod
import Build.SysConfig (packageversion)
@ -23,7 +23,7 @@ import Yesod
- be read in and displayed. -}
licenseFile :: IO (Maybe FilePath)
licenseFile = do
base <- standaloneOSXAppBase
base <- standaloneAppBase
return $ (</> "LICENSE") <$> base
getAboutR :: Handler RepHtml
@ -39,7 +39,7 @@ getLicenseR = do
case v of
Nothing -> redirect AboutR
Just f -> bootstrap (Just About) $ do
sideBarDisplay
-- no sidebar, just pages of legalese..
setTitle "License"
license <- liftIO $ readFile f
$(widgetFile "documentation/license")

View file

@ -64,7 +64,7 @@ writeFDODesktop command = do
=<< inDestDir (desktopMenuFilePath "git-annex" datadir)
configdir <- ifM systemwideInstall ( return systemConfigDir, userConfigDir )
writeDesktopMenuFile (autostart command)
installAutoStart command
=<< inDestDir (autoStartPath "git-annex" configdir)
writeOSXDesktop :: FilePath -> IO ()

View file

@ -148,7 +148,7 @@ linuxstandalone: $(bins)
cp git-annex "$(LINUXSTANDALONE_DEST)/bin/"
strip "$(LINUXSTANDALONE_DEST)/bin/git-annex"
ln -sf git-annex "$(LINUXSTANDALONE_DEST)/bin/git-annex-shell"
zcat doc/license/git-annex-osx.app-licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE
zcat standalone/licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE
for bin in $(THIRDPARTY_BINS); do \
cp "$$(which "$$bin")" "$(LINUXSTANDALONE_DEST)/bin/" || echo "$$bin not available; skipping"; \
@ -184,7 +184,7 @@ osxapp: $(bins)
cp git-annex "$(OSXAPP_BASE)/bin/"
strip "$(OSXAPP_BASE)/bin/git-annex"
ln -sf git-annex "$(OSXAPP_BASE)/bin/git-annex-shell"
gzcat doc/license/git-annex-osx.app-licences.gz > $(OSXAPP_BASE)/LICENSE
gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE
cp $(OSXAPP_BASE)/LICENSE $(GIT_ANNEX_TMP_BUILD_DIR)/build-dmg/LICENSE.txt
for bin in $(THIRDPARTY_BINS); do \

23
standalone/linux/README Normal file
View file

@ -0,0 +1,23 @@
To start the git-annex webapp, run the git-annex-webapp script in this
directory.
To enter an environment with git-annex in PATH, use runshell
This should work on any Linux system of the appropriate architecture.
More or less. There are no external dependencies, except for glibc.
Any recent-ish version of glibc should work (2.13 is ok; so is 2.11).
How it works: This directory contains a lot of libraries and programs
that git-annex needs. But it's not a chroot. Instead, runshell sets
PATH and LD_LIBRARY_PATH to point to the stuff in this directory.
The glibc libs are not included. Instead, it runs with the host system's
glibc. We trust that glibc's excellent backwards and forward compatability
is good enough to run binaries that were linked for a newer or older
version. Of course, this could fail. Particularly if the binaries try to
use some new glibc feature. But hopefully not.
Why not bundle glibc too? I've not gotten it to work! The host system's
ld-linux.so will be used for sure, as that's hardcoded into the binaries.
When I tried including libraries from glibc in here, everything segfaulted.

View file

@ -0,0 +1,25 @@
#!/bin/sh
base="$(dirname $0)"
if [ ! -d "$base" ]; then
echo "** cannot find base directory (I seem to be $0)" >&2
exit 1
fi
if [ ! -e "$base/runshell" ]; then
echo "** cannot find $base/runshell" >&2
exit 1
fi
# Get absolute path to base, to avoid breakage when things change directories.
orig="$(pwd)"
cd "$base"
base="$(pwd)"
cd "$orig"
# If this is a standalone app, set a variable that git-annex can use to
# install itself.
if [ -e "$base/bin/git-annex" ]; then
GIT_ANNEX_APP_BASE="$base"
export GIT_ANNEX_APP_BASE
fi
"$base/runshell" git-annex webapp "$@"

View file

@ -0,0 +1,43 @@
libanl-.*.so
libutil-.*.so
libnss_hesiod-.*.so
libcrypt-.*.so
libnss_compat-.*.so
libm-.*.so
libr.so
libpcprofile.so
libnss_nis-.*.so
libSegFault.so
libpthread-.*.so
librt-.*.so
libnss_dns-.*.so
libdl-.*.so
libBrokenLocale-.*.so
libnss_nisplus-.*.so
libthread_db-1.0.so
libmemusage.so
libcidn-.*.so
libnss_files-.*.so
libnsl-.*.so
libc-.*.so
ld-.*.so
libnss_nis.so
libthread_db.so
libanl.so
libr.so
libnss_compat.so
libm.so
libnss_dns.so
libpthread.so
libc.so
librt.so
libcidn.so
libnss_nisplus.so
libnsl.so
libutil.so
libBrokenLocale.so
ld-linux.so
libnss_files.so
libdl.so
libnss_hesiod.so
libcrypt.so

48
standalone/linux/runshell Executable file
View file

@ -0,0 +1,48 @@
#!/bin/sh
# Runs a shell command (or interactive shell) using the binaries and
# libraries bundled with this app.
set -e
base="$(dirname $0)"
if [ ! -d "$base" ]; then
echo "** cannot find base directory (I seem to be $0)" >&2
exit 1
fi
if [ ! -e "$base/bin/git-annex" ]; then
echo "** base directory $base does not contain bin/git-annex" >&2
exit 1
fi
if [ ! -e "$base/bin/git" ]; then
echo "** base directory $base does not contain bin/git" >&2
exit 1
fi
# Get absolute path to base, to avoid breakage when things change directories.
orig="$(pwd)"
cd "$base"
base="$(pwd)"
cd "$orig"
# Put our binaries first, to avoid issues with out of date or incompatable
# system binaries.
PATH=$base/bin:$PATH
export PATH
for lib in $(cat $base/libdirs); do
LD_LIBRARY_PATH="$base/$lib:$LD_LIBRARY_PATH"
done
export LD_LIBRARY_PATH
GIT_EXEC_PATH=$base/git-core
export GIT_EXEC_PATH
if [ "$1" ]; then
cmd="$1"
shift 1
exec "$cmd" "$@"
else
$SHELL
fi

View file

@ -9,11 +9,17 @@ if [ ! -e "$base/runshell" ]; then
exit 1
fi
# Get absolute path to base, to avoid breakage when things change directories.
orig="$(pwd)"
cd "$base"
base="$(pwd)"
cd "$orig"
# If this is a standalone app, set a variable that git-annex can use to
# install itself.
if [ -e "$base/bin/git-annex" ]; then
GIT_ANNEX_OSX_APP_BASE="$base"
export GIT_ANNEX_OSX_APP_BASE
GIT_ANNEX_APP_BASE="$base"
export GIT_ANNEX_APP_BASE
fi
"$base/runshell" git-annex webapp "$@"