standalone linux app nearly ready
also made several fixes that apply to the OSX app
This commit is contained in:
parent
f0d75cd928
commit
e88e3ba85b
11 changed files with 187 additions and 20 deletions
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
[]
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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 ()
|
||||
|
|
4
Makefile
4
Makefile
|
@ -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 \
|
||||
|
|
Binary file not shown.
23
standalone/linux/README
Normal file
23
standalone/linux/README
Normal 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.
|
25
standalone/linux/git-annex-webapp
Executable file
25
standalone/linux/git-annex-webapp
Executable 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 "$@"
|
43
standalone/linux/glibc-libs
Normal file
43
standalone/linux/glibc-libs
Normal 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
48
standalone/linux/runshell
Executable 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
|
|
@ -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 "$@"
|
||||
|
|
Loading…
Reference in a new issue