git-annex/Build/InstallDesktopFile.hs

123 lines
3.3 KiB
Haskell
Raw Normal View History

2012-08-02 03:31:53 +00:00
{- Generating and installing a desktop menu entry file
2012-09-06 16:43:46 +00:00
- and a desktop autostart file. (And OSX equivilants.)
-
- Copyright 2012 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
2012-09-06 16:58:46 +00:00
{-# LANGUAGE CPP #-}
module Build.InstallDesktopFile where
import Utility.Exception
import Utility.FreeDesktop
import Utility.Path
2012-09-06 16:43:46 +00:00
import Utility.Monad
import Locations.UserConfig
import Utility.OSX
import Assistant.Install.AutoStart
import Control.Applicative
import System.Directory
import System.Environment
import System.Posix.User
import System.Posix.Files
2012-09-06 16:43:46 +00:00
import System.FilePath
import Data.Maybe
{- The command can be either just "git-annex", or the full path to use
- to run it. -}
desktop :: FilePath -> DesktopEntry
desktop command = genDesktopEntry
"Git Annex"
"Track and sync the files in your Git Annex"
False
(command ++ " webapp")
["Network", "FileTransfer"]
2012-08-02 03:31:53 +00:00
autostart :: FilePath -> DesktopEntry
autostart command = genDesktopEntry
"Git Annex Assistant"
"Autostart"
False
(command ++ " assistant --autostart")
[]
systemwideInstall :: IO Bool
systemwideInstall = isroot <||> destdirset
where
isroot = do
uid <- fromIntegral <$> getRealUserID
return $ uid == (0 :: Int)
destdirset = isJust <$> catchMaybeIO (getEnv "DESTDIR")
2012-08-02 03:31:53 +00:00
2012-09-06 16:43:46 +00:00
inDestDir :: FilePath -> IO FilePath
inDestDir f = do
2012-09-17 04:18:07 +00:00
destdir <- catchDefaultIO "" (getEnv "DESTDIR")
return $ destdir ++ "/" ++ f
2012-09-06 16:43:46 +00:00
2012-09-06 16:58:46 +00:00
writeFDODesktop :: FilePath -> IO ()
writeFDODesktop command = do
datadir <- ifM systemwideInstall ( return systemDataDir, userDataDir )
2012-09-06 16:43:46 +00:00
writeDesktopMenuFile (desktop command)
=<< inDestDir (desktopMenuFilePath "git-annex" datadir)
2012-08-02 03:31:53 +00:00
configdir <- ifM systemwideInstall ( return systemConfigDir, userConfigDir )
installAutoStart command
2012-09-06 16:43:46 +00:00
=<< inDestDir (autoStartPath "git-annex" configdir)
2012-09-06 16:58:46 +00:00
writeOSXDesktop :: FilePath -> IO ()
writeOSXDesktop command = do
installAutoStart command =<< inDestDir =<< ifM systemwideInstall
2012-09-29 05:08:05 +00:00
( return $ systemAutoStart osxAutoStartLabel
, userAutoStart osxAutoStartLabel
)
{- Install the OSX app in non-self-contained mode. -}
let appdir = "git-annex.app"
installOSXAppFile appdir "Contents/Info.plist" Nothing
installOSXAppFile appdir "Contents/Resources/git-annex.icns" Nothing
2012-09-25 14:25:31 +00:00
installOSXAppFile appdir "Contents/MacOS/git-annex-webapp" (Just webappscript)
2012-09-06 16:58:46 +00:00
where
webappscript = unlines
[ "#!/bin/sh"
, command ++ " webapp"
]
installOSXAppFile :: FilePath -> FilePath -> Maybe String -> IO ()
installOSXAppFile appdir appfile mcontent = do
2012-10-06 21:03:40 +00:00
let src = "standalone" </> "osx" </> appdir </> appfile
home <- myHomeDir
dest <- ifM systemwideInstall
2012-09-23 16:00:14 +00:00
( return $ "/Applications" </> appdir </> appfile
, return $ home </> "Desktop" </> appdir </> appfile
)
createDirectoryIfMissing True (parentDir dest)
case mcontent of
Just content -> writeFile dest content
Nothing -> copyFile src dest
mode <- fileMode <$> getFileStatus src
setFileMode dest mode
install :: FilePath -> IO ()
install command = do
2012-09-06 16:58:46 +00:00
#ifdef darwin_HOST_OS
writeOSXDesktop command
2012-09-06 16:58:46 +00:00
#else
writeFDODesktop command
2012-09-06 16:58:46 +00:00
#endif
ifM systemwideInstall
( return ()
, do
programfile <- inDestDir =<< programFile
createDirectoryIfMissing True (parentDir programfile)
writeFile programfile command
)
2012-09-06 16:58:46 +00:00
main :: IO ()
main = getArgs >>= go
where
go [] = error "specify git-annex command"
go (command:_) = install command