diff options
| author | Camil Staps | 2017-02-06 22:54:04 +0100 | 
|---|---|---|
| committer | Camil Staps | 2017-02-06 22:54:04 +0100 | 
| commit | bf30b006c94358707756b13ae452452e52769f8f (patch) | |
| tree | 116b0684bf4b17cda26e3d25f14b1483e954ebd7 | |
| parent | Added help text (diff) | |
Add very basic installation task
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | CLPM/Package.dcl | 6 | ||||
| -rw-r--r-- | CLPM/Package.icl | 38 | ||||
| -rw-r--r-- | CLPM/Repository.dcl | 1 | ||||
| -rw-r--r-- | CLPM/Repository.icl | 28 | ||||
| -rw-r--r-- | CLPM/Util.dcl | 6 | ||||
| -rw-r--r-- | CLPM/Util.icl | 62 | ||||
| -rw-r--r-- | clpm.icl | 59 | 
8 files changed, 144 insertions, 57 deletions
| @@ -1,2 +1,3 @@  Clean System Files/  clpm +clpm_modules diff --git a/CLPM/Package.dcl b/CLPM/Package.dcl index 3ddf521..5499a5d 100644 --- a/CLPM/Package.dcl +++ b/CLPM/Package.dcl @@ -46,9 +46,7 @@ PACKAGE_FILE :== "clpm.json"  	  }  :: Dependency -	= Git Url GitTag -	| Download Url -	| Package PackageName VersionRequirement +	= Package PackageName VersionRequirement  :: Options  	= { show_result       :: Bool @@ -104,3 +102,5 @@ resolveDependencies :: Repository Package -> MaybeErrorString [(Dependency, Vers  getRecursivePaths :: Package *World -> (MaybeErrorString [Path], *World)  optionsToFlags :: Options -> [String] + +install :: Dependency Version *World -> *(MaybeErrorString (), *World) diff --git a/CLPM/Package.icl b/CLPM/Package.icl index 3f3001f..fedb224 100644 --- a/CLPM/Package.icl +++ b/CLPM/Package.icl @@ -19,8 +19,12 @@ import Data.Functor  import Data.List  import Data.Tuple +import Internet.HTTP + +import System.Directory  import System.File  import System.FilePath +import System.Platform  from Text import class Text(indexOf,subString),  	instance Text String, instance + String @@ -247,3 +251,37 @@ optionsToFlags opts  	++ ["-h " + toString opts.Options.heap_size + "k"]  	++ ["-s " + toString opts.Options.stack_size + "k"]  	++ opts.Options.extra_flags + +install :: Dependency Version *World -> *(MaybeErrorString (), *World) +install d v w +# (tar,w) = doRequest req w +| isError tar +	= (Error $ fromError tar, w) +# (err,w) = writeFile (depName d + ".tar.gz") (fromOk tar).rsp_data w +| isError err +	= (Error $ toString (fromError err) + " while installing " + depName d + ".", w) +# (err,w) = createDirectory (MODULE_DIR </> depName d) w +| isError err +	= (Error $ snd (fromError err) + " while installing " + depName d + ".", w) +# (r,w) = syscall ("tar xzf '" + depName d + ".tar.gz' -C '" + MODULE_DIR </> depName d + "' --strip-components=1\0") w +# (err,w) = deleteFile (depName d + ".tar.gz") w +| r <> 0 +	= (Error $ "Failed to unpack " + depName d + ".tar.gz.", w) +| isError err +	= (Error $ snd (fromError err) + " while installing " + depName d + ".", w) += (Ok (), w) +where +	req = +		{ newHTTPRequest +		& req_path = "/repo/" + depName d + "/" + toString v + "/" + platform + ".tar.gz" +		, server_name = REPOSITORY +		, server_port = PORT +		} + +	platform :: String +	platform = case CURRENT_PLATFORM of +		Linux32   = "linux32" +		Linux64   = "linux64" +		Mac       = "mac" +		Windows32 = "win32" +		Windows64 = "win64" diff --git a/CLPM/Repository.dcl b/CLPM/Repository.dcl index f9dce62..8dcf751 100644 --- a/CLPM/Repository.dcl +++ b/CLPM/Repository.dcl @@ -10,7 +10,6 @@ from CLPM.Package import  	:: VersionRequirement  REPOSITORY :== "clpm.camilstaps.nl" -TIMEOUT :== 10000  PORT :== 80  :: Repository :== [RepositoryItem] diff --git a/CLPM/Repository.icl b/CLPM/Repository.icl index 587715f..d0b089d 100644 --- a/CLPM/Repository.icl +++ b/CLPM/Repository.icl @@ -5,8 +5,6 @@ import StdClass  from StdFunc import flip, o  import StdOverloaded -import TCPIP -  import Control.Applicative  import Control.Monad @@ -22,37 +20,25 @@ from Text import instance + String  import Text.JSON  import CLPM.Package +import CLPM.Util  derive JSONDecode RepositoryItem, RepositoryItemVersion  getRepository :: Url *World -> *(MaybeErrorString Repository, *World)  getRepository repo w -# (ip,w) = lookupIPAddress repo w -| isNothing ip -	= (Error $ "DNS lookup for " + repo + " failed.", w) -# (Just ip) = ip -# (rpt,chan,w) = connectTCP_MT (Just TIMEOUT) (ip, PORT) w -| rpt == TR_Expired -	= (Error $ "Connection to " + repo + " timed out.", w) -| rpt == TR_NoSuccess -	= (Error $ "Could not connect to " + repo + ".", w) -# (Just {sChannel,rChannel}) = chan -# (rpt,i,sChannel,w) = send_MT (Just TIMEOUT) req sChannel w -| rpt <> TR_Success -	= (Error $ "Could not request repository from " + repo + ".", w) -# (resp,rChannel,w) = appFst3 (parseResponse o toString) $ receive rChannel w -| isNothing resp -	= (Error $ "Server did not respond with HTTP.", w) -# repo = fromJSON $ fromString (fromJust resp).rsp_data +# (resp,w) = doRequest req w +| isError resp +	= (Error $ fromError resp, w) +# repo = fromJSON $ fromString (fromOk resp).rsp_data  | isNothing repo  	= (Error $ "Server did not return a repository.", w) -# w = closeChannel sChannel (closeRChannel rChannel w)  = (Ok $ fromJust repo, w)  where -	req = toByteSeq +	req =  		{ newHTTPRequest  		& req_path = "/list.php"  		, server_name = REPOSITORY +		, server_port = PORT  		}  getVersions :: (PackageName Repository -> [RepositoryItemVersion]) diff --git a/CLPM/Util.dcl b/CLPM/Util.dcl index b750058..3e3a0c2 100644 --- a/CLPM/Util.dcl +++ b/CLPM/Util.dcl @@ -2,6 +2,12 @@ definition module CLPM.Util  from Data.Error import :: MaybeError, :: MaybeErrorString +from Internet.HTTP import :: HTTPRequest, :: HTTPResponse +  class Parse a where Parse :: [Char] -> MaybeErrorString a  parse :: (String -> MaybeErrorString a) | Parse a + +doRequest :: HTTPRequest *World -> *(MaybeErrorString HTTPResponse, *World) + +syscall :: !String !*World -> !*(!Int, !*World) diff --git a/CLPM/Util.icl b/CLPM/Util.icl index a3d016e..2d4004e 100644 --- a/CLPM/Util.icl +++ b/CLPM/Util.icl @@ -2,7 +2,69 @@ implementation module CLPM.Util  import StdEnv +import TCPIP + +import Control.Applicative +import Control.Monad +  import Data.Error +from Data.Func import $ +import Data.Functor +import Data.List +import Data.Tuple + +import Internet.HTTP + +from Text import instance + String + +TIMEOUT :== Just 10000  parse :: (String -> MaybeErrorString a) | Parse a  parse = Parse o fromString + +doRequest :: HTTPRequest *World -> *(MaybeErrorString HTTPResponse, *World) +doRequest req w +# (ip,w) = lookupIPAddress server_name w +| isNothing ip +	= (Error $ "DNS lookup for " + server_name + " failed.", w) +# (Just ip) = ip +# (rpt,chan,w) = connectTCP_MT TIMEOUT (ip, req.server_port) w +| rpt == TR_Expired +	= (Error $ "Connection to " + server_name + " timed out.", w) +| rpt == TR_NoSuccess +	= (Error $ "Could not connect to " + server_name + ".", w) +# (Just {sChannel,rChannel}) = chan +# (rpt,i,sChannel,w) = send_MT TIMEOUT (toByteSeq req) sChannel w +| rpt <> TR_Success +	= (Error $ "Could not send request to " + server_name + ".", w) +# (rpt,resp,rChannel,w) = receive_MT TIMEOUT rChannel w +| rpt <> TR_Success +	= (Error $ "Did not receive a reply from " + server_name + ".", w) +# resp = join $ parseResponse <$> toString <$> resp +| isNothing resp +	# w = closeChannel sChannel (closeRChannel rChannel w) +	= (Error $ "Server did not respond with HTTP.", w) +# (resp,rChannel,w) = receiveRest (fromJust resp) rChannel w +# w = closeChannel sChannel (closeRChannel rChannel w) += (resp,w) +where +	server_name = req.server_name + +	/*receiveRest :: HTTPResponse !*(ch .a) !*env +		-> *(MaybeErrorString HTTPResponse, !*(ch .a), !*env) +		| Receive ch & ChannelEnv env*/ +	receiveRest resp chan w +	# cl = lookup "Content-Length" resp.HTTPResponse.rsp_headers +	| isNothing cl +		= (Ok resp, chan, w) +	| size resp.rsp_data >= toInt (fromJust cl) +		= (Ok resp, chan, w) +	# (rpt,newresp,chan,w) = receive_MT TIMEOUT chan w +	| rpt <> TR_Success +		= (Error $ server_name + " hung up during transmission.", chan, w) +	= receiveRest {resp & rsp_data=resp.rsp_data + toString (fromJust newresp)} chan w + +syscall :: !String !*World -> !*(!Int, !*World) +syscall cmd w = code { +	ccall system "s:I:A" +} @@ -26,6 +26,7 @@ import System.File  import CLPM.Package  import CLPM.Repository +import CLPM.Util  CLPM_VERSION :== (0,1,0) @@ -37,7 +38,7 @@ CLPM_VERSION :== (0,1,0)  :: Arguments  	= { package_file :: String  	  , action       :: Action -	  , repository   :: String +	  //, repository   :: String  	  , clm_options  :: [String]  	  , show_help    :: Bool  	  } @@ -47,7 +48,7 @@ where  	zero  		= { package_file = PACKAGE_FILE  		  , action       = NoAction -		  , repository   = REPOSITORY +		  //, repository   = REPOSITORY  		  , clm_options  = []  		  , show_help    = False  		  } @@ -56,13 +57,13 @@ Start w  # (io,w) = stdio w  # ((missed, args), w) = appFst (parseArgs zero o tl) $ getCommandLine w  | not (isEmpty missed) -	# io = foldr (flip (<<<)) io ["Unknown option: " + m + "\n" \\ m <- missed] +	# io = foldr (flip (<<<)) io ["Unknown option: " + m + "\r\n" \\ m <- missed]  	= snd $ fclose io w  | args.show_help  	= snd $ fclose (io <<< HELP_TEXT) w  # (pkg,w) = readPackage args.package_file w  | isError pkg -	# io = io <<< fromError pkg <<< "\n" +	# io = io <<< fromError pkg <<< "\r\n"  	# (_,w) = fclose io w  	= w  # (Ok pkg) = pkg @@ -73,39 +74,38 @@ Start w  do :: Arguments Package *File *World -> *(*File, *World)  do args pkg io w = case args.action of  	NoAction = (io,w) -	Install  = install pkg io w -	Make     = make args.clm_options pkg io w +	Install  = cmd_install pkg io w +	Make     = cmd_make args.clm_options pkg io w -install :: Package *File *World -> *(*File, *World) -install pkg io w +cmd_install :: Package *File *World -> *(*File, *World) +cmd_install pkg io w  # (e,w) = fileExists MODULE_DIR w  # w = if e w (snd $ createDirectory MODULE_DIR w)  # (repo,w) = getRepository REPOSITORY w  | isError repo -	= (io <<< fromError repo <<< "\n", w) +	= (io <<< fromError repo <<< "\r\n", w)  # (Ok repo) = repo -# io = foldl printRepo io repo  # solv = resolveDependencies repo pkg  | isError solv -	= (io <<< fromError solv <<< "\n", w) +	= (io <<< fromError solv <<< "\r\n", w)  # (Ok solv) = solv -# io = io <<< "Dependencies:\n" -# io = printDeps io solv +# io = io <<< "Installing dependencies:\r\n" +# (io,w) = installAll solv io w  = (io,w)  where -	printRepo :: *File RepositoryItem -> *File -	printRepo f ri = f <<< ri.RepositoryItem.name <<< "\t" <<< -		foldl (+++) "" [toString v.RepositoryItemVersion.version + ", " \\ v <- ri.RepositoryItem.versions] -		<<< "\n" - -	printDeps :: *File [(Dependency, Version)] -> *File -	printDeps f ds = foldl (<<<) f [depName d + "\t" + toString v + "\n" \\ (d,v) <- ds] - -make :: [String] Package *File *World -> *(*File, *World) -make opts pkg io w +	installAll :: [(Dependency, Version)] *File *World -> *(*File, *World) +	installAll [] f w = (f,w) +	installAll [(d,v):ds] f w +	# f = f <<< "Installing " <<< depName d <<< ":" <<< toString v <<< "...\r\n" +	# (err,w) = install d v w +	| isError err = (f <<< fromError err <<< "\r\n", w) +	= installAll ds f w + +cmd_make :: [String] Package *File *World -> *(*File, *World) +cmd_make opts pkg io w  # (ps,w) = getRecursivePaths pkg w  | isError ps -	= (io <<< fromError ps <<< "\n", w) +	= (io <<< fromError ps <<< "\r\n", w)  # ps = fromOk ps  # (r,w) = syscall (foldl (+) "clm" [" -I " + p \\ p <- ps] +  	foldl (+) "" [" " + f \\ f <- optionsToFlags pkg.options ++ opts] + @@ -120,17 +120,12 @@ where  	pa miss args ["-h":rest]      = pa miss {args & show_help = True} rest  	pa miss args ["--help":rest]  = pa miss {args & show_help = True} rest  	pa miss args ["-p":name:rest] = pa miss {args & package_file = name} rest -	pa miss args ["-r":repo:rest] = pa miss {args & repository = repo} rest +	//pa miss args ["-r":repo:rest] = pa miss {args & repository = repo} rest  	pa miss args ["-c":opt:rest]  = pa miss {args & clm_options = args.clm_options ++ [opt]} rest  	pa miss args ["install":rest] = pa miss {args & action = Install} rest  	pa miss args ["make":rest]    = pa miss {args & action = Make} rest  	pa miss args [a:rest]         = pa [a:miss] args rest -syscall :: !String !*World -> !*(!Int, !*World) -syscall cmd w = code { -	ccall system "s:I:A" -} -  HELP_TEXT =:  	"CLPM - A Clean Package Manager - v" + toString CLPM_VERSION + "\r\n\r\n" +  	"Usage: clpm <command> [option]\r\n\r\n" + @@ -151,8 +146,8 @@ where  		  "Print this help text")  		, ("-p <FILE>",  		  "Use FILE as package file instead of package.json") -		, ("-r <HOST>", -		  "Use HOST as repository provider instead of " + REPOSITORY) +		//, ("-r <HOST>", +		//  "Use HOST as repository provider instead of " + REPOSITORY)  		]  	pad :: Int Int String -> String | 
