git-annex/Build/InstallDesktopFile.hs

120 lines
3.1 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 Control.Applicative
import Control.Monad
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
{- 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")
[]
2012-09-06 16:43:46 +00:00
isRoot :: IO Bool
isRoot = do
uid <- fromIntegral <$> getRealUserID
2012-09-06 16:43:46 +00:00
return $ uid == 0
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")
2012-09-06 16:43:46 +00:00
return $ destdir </> f
2012-09-06 16:58:46 +00:00
writeFDODesktop :: FilePath -> IO ()
writeFDODesktop command = do
2012-09-06 16:43:46 +00:00
datadir <- ifM isRoot ( return systemDataDir, userDataDir )
writeDesktopMenuFile (desktop command)
=<< inDestDir (desktopMenuFilePath "git-annex" datadir)
2012-08-02 03:31:53 +00:00
2012-09-06 16:43:46 +00:00
configdir <- ifM isRoot ( return systemConfigDir, userConfigDir )
writeDesktopMenuFile (autostart command)
=<< inDestDir (autoStartPath "git-annex" configdir)
2012-09-06 16:43:46 +00:00
ifM isRoot
( return ()
, do
programfile <- inDestDir =<< programFile
createDirectoryIfMissing True (parentDir programfile)
writeFile programfile command
)
2012-09-06 16:58:46 +00:00
writeOSXDesktop :: FilePath -> IO ()
writeOSXDesktop command = do
home <- myHomeDir
let base = "Library" </> "LaunchAgents" </> label ++ ".plist"
2012-09-06 17:04:26 +00:00
autostart <- ifM isRoot ( inDestDir $ "/" </> base , inDestDir $ home </> base)
2012-09-06 17:06:44 +00:00
createDirectoryIfMissing True (parentDir autostart)
2012-09-06 16:58:46 +00:00
writeFile autostart $ unlines
[ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
, "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"
, "<plist version=\"1.0\">"
, "<dict>"
, "<key>Label</key>"
, "<string>" ++ label ++ "</string>"
, "<key>ProgramArguments</key>"
, "<array>"
, "<string>" ++ command ++ "</string>"
, "<string>assistant</string>"
, "<string>--autostart</string>"
, "</array>"
, "<key>RunAtLoad</key>"
, "</dict>"
, "</plist>"
]
ifM isRoot
( return ()
, do
2012-09-06 17:51:44 +00:00
let commandfile = home </> "Desktop" </> "git-annex-webapp.command"
writeFile commandfile $ unwords [command, "webapp"]
2012-09-06 17:51:44 +00:00
mode <- fileMode <$> getFileStatus commandfile
setFileMode commandfile $ mode `unionFileModes` ownerExecuteMode
)
2012-09-06 16:58:46 +00:00
where
label = "com.branchable.git-annex.assistant"
writeDesktop :: FilePath -> IO ()
#ifdef darwin_HOST_OS
writeDesktop = writeOSXDesktop
#else
writeDesktop = writeFDODesktop
#endif
main = getArgs >>= go
where
go [] = error "specify git-annex command"
2012-08-02 03:31:53 +00:00
go (command:_) = writeDesktop command