From 4dfb4975ffb1db1592eee27380645410d498acbe Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Fri, 14 Jan 2022 05:19:50 +0400 Subject: [PATCH] fetch works --- src/unix/vpkEnv.Mod | 35 +++++++++++++++++++---- src/unix/vpkGit.Mod | 5 ++++ src/vipack.Mod | 57 ++++++++++++++++++++++++++----------- src/vpkConf.Mod | 16 +++++------ src/vpkInstaller.Mod | 23 +++++++++++++-- src/vpkJsonDepRetriever.Mod | 40 +++++++++++++++++++++++++- src/vpkJsonParser.Mod | 1 + src/vpkSettings.Mod | 20 ++++++++----- src/vpkSyncer.Mod | 15 ++++++++++ 9 files changed, 171 insertions(+), 41 deletions(-) diff --git a/src/unix/vpkEnv.Mod b/src/unix/vpkEnv.Mod index b35df65..26cf58d 100644 --- a/src/unix/vpkEnv.Mod +++ b/src/unix/vpkEnv.Mod @@ -19,6 +19,25 @@ BEGIN Strings.Append(vpkSettings.vpkConfDir, path); END mkConfDirPath; +PROCEDURE mkdefPkgDirPath*(VAR name, path: ARRAY OF CHAR); +VAR + home: ARRAY 128 OF CHAR; +BEGIN + getHome(home); + COPY(home, path); + Strings.Append("/", path); + Strings.Append(vpkSettings.vpkPkgDir, path); + Strings.Append("/", path); + Strings.Append(name, path); +END mkdefPkgDirPath; + +PROCEDURE mkPkgDirPath*(VAR name, path: ARRAY OF CHAR); +BEGIN + Strings.Append("/", path); + Strings.Append(name, path); +END mkPkgDirPath; + + PROCEDURE setConfFileName; VAR home: ARRAY 128 OF CHAR; @@ -65,6 +84,16 @@ BEGIN Strings.Append(vpkSettings.vpkTreeDir, path); END getTreeDir; +PROCEDURE createIfNotThere*(VAR file: vpkFiles.fileInfo); +BEGIN + IF ~vpkFiles.Exists(file) THEN + IF ~vpkFiles.mkDir(file.name) THEN + Out.String("failed to create directory "); Out.String(file.name); Out.Ln; HALT(1); + END; + END; + +END createIfNotThere; + PROCEDURE checkEnv*; VAR file : vpkFiles.fileInfo; @@ -91,11 +120,7 @@ BEGIN Strings.Append('/', tmp); Strings.Append(vpkSettings.vpkTreeDir, tmp); file.name := tmp; - IF ~vpkFiles.Exists(file) THEN - IF ~vpkFiles.mkDir(file.name) THEN - Out.String("failed to create tree dir "); Out.String(tmp); Out.Ln; HALT(1); - END; - END; + createIfNotThere(file); END checkEnv; BEGIN diff --git a/src/unix/vpkGit.Mod b/src/unix/vpkGit.Mod index e6a5384..bb39058 100644 --- a/src/unix/vpkGit.Mod +++ b/src/unix/vpkGit.Mod @@ -25,4 +25,9 @@ BEGIN pull(url, tmp); END syncTree; +PROCEDURE fetchRepo*(url: ARRAY OF CHAR; dst: ARRAY OF CHAR); +BEGIN + pull(url, dst); +END fetchRepo; + END vpkGit. diff --git a/src/vipack.Mod b/src/vipack.Mod index 219d893..4596d75 100644 --- a/src/vipack.Mod +++ b/src/vipack.Mod @@ -1,6 +1,6 @@ MODULE vipack; IMPORT Texts, Strings, Oberon, Out, - vpkConf, vpkLogger, vpkSyncer, vpkInstaller, opts, StringList; + vpkConf, vpkLogger, vpkSyncer, vpkInstaller, vpkdepTree, opts, StringList; (* PROCEDURE processArgs(VAR package, prefix, tree: ARRAY OF CHAR; deps, sync: BOOLEAN); VAR @@ -80,14 +80,23 @@ BEGIN END processArgs; *) + +PROCEDURE msgnopkg(VAR options: opts.Options); +BEGIN + Out.String("you need to mention package name to resolve dependencies for it"); Out.Ln; Out.Ln; + opts.showHelp(options); +END msgnopkg; + PROCEDURE main; VAR - deps, sync: BOOLEAN; - package, prefix, tree: ARRAY 64 OF CHAR; + deps, sync, fetch: BOOLEAN; + package, prefix, pkgTree: ARRAY 128 OF CHAR; options: opts.Options; foptions: opts.Options; opt, fopt: opts.Option; + + depTree: vpkdepTree.TdepTree; BEGIN options := opts.createOptions(); foptions := opts.createOptions(); @@ -108,6 +117,14 @@ BEGIN opts.setOptRequired(opt, FALSE); options.add(options, opt); + opt := opts.createOpt(); + opts.setOptName(opt, "-f"); + opts.setOptLName(opt, "--fetch"); + opts.setOptHasVal(opt, FALSE); + opts.setOptDesc(opt, "only resolve and fetch, do not build"); + opts.setOptRequired(opt, FALSE); + options.add(options, opt); + opt := opts.createOpt(); opts.setOptName(opt, "-s"); opts.setOptLName(opt, "--sync"); @@ -142,34 +159,40 @@ BEGIN END; Out.Ln; - COPY("", package); COPY("", prefix); COPY("", tree); + COPY("", package); COPY("", prefix); COPY("", pkgTree); deps := FALSE; sync := FALSE; fopt := opts.createOpt(); fopt := opts.findOpt("-d", foptions); IF fopt # NIL THEN deps := TRUE END; - fopt := opts.createOpt(); - fopt := opts.findOpt("-s", foptions); - IF fopt # NIL THEN sync := TRUE END; + fopt := opts.createOpt(); + fopt := opts.findOpt("-f", foptions); + IF fopt # NIL THEN fetch := TRUE END; + + fopt := opts.createOpt(); + fopt := opts.findOpt("-s", foptions); + IF fopt # NIL THEN sync := TRUE END; opts.valOfOpt("-p", foptions, package); opts.valOfOpt("-P", foptions, prefix); - opts.valOfOpt("-t", foptions, tree); + opts.valOfOpt("-t", foptions, pkgTree); IF sync THEN vpkSyncer.sync - ELSIF deps THEN - IF package # "" THEN - vpkInstaller.resolve(package); - ELSE - Out.String("you need to mention package name to resolve dependencies for it"); Out.Ln; Out.Ln; - opts.showHelp(options); - END ELSE - - vpkInstaller.build(package, prefix, tree) + IF package # "" THEN + IF deps THEN + depTree := vpkInstaller.resolve(package) + ELSIF fetch THEN + vpkInstaller.fetch(package, prefix, pkgTree) + ELSE + vpkInstaller.build(package, prefix, pkgTree) + END + ELSE + msgnopkg(options) + END END; END main; diff --git a/src/vpkConf.Mod b/src/vpkConf.Mod index 45fc525..364718f 100644 --- a/src/vpkConf.Mod +++ b/src/vpkConf.Mod @@ -15,11 +15,11 @@ PROCEDURE mkConfContent(VAR path: ARRAY OF CHAR); BEGIN COPY("", path); Strings.Append(open, path); - Strings.Append(vpkSettings.confTreeKey, path); + Strings.Append(vpkSettings.rmtTreeKey, path); Strings.Append(is, path); Strings.Append(vpkSettings.defTreeVal, path); Strings.Append(newkey, path); - Strings.Append(vpkSettings.confTypKey, path); + Strings.Append(vpkSettings.rmtTypKey, path); Strings.Append(is, path); Strings.Append(vpkSettings.defTypVal, path); Strings.Append(close, path); @@ -60,13 +60,13 @@ BEGIN WHILE ~ r.eof & (i < LEN(dt)) DO Files.Read(r, ch); dt[i] := ch; INC(i) END; Files.Close(f); jsonRecord := vpkJsonParser.Create(dt); - b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.confTreeKey, tree.url); - IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.confTreeKey); Out.String(" from json"); Out.Ln; HALT(1); END; - b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.confTypKey, treeTyp); - IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.confTypKey); Out.String(" from json"); Out.Ln; HALT(1); END; - IF treeTyp = vpkSettings.confTypGitVal THEN + b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.rmtTreeKey, tree.url); + IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.rmtTreeKey); Out.String(" from json"); Out.Ln; HALT(1); END; + b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.rmtTypKey, treeTyp); + IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.rmtTypKey); Out.String(" from json"); Out.Ln; HALT(1); END; + IF treeTyp = vpkSettings.rmtTypGitVal THEN tree.typ := vpkSettings.git; - ELSIF treeTyp = vpkSettings.confTypHttpVal THEN + ELSIF treeTyp = vpkSettings.rmtTypHttpVal THEN tree.typ := vpkSettings.http ELSE tree.typ := vpkSettings.unkn; diff --git a/src/vpkInstaller.Mod b/src/vpkInstaller.Mod index d219d61..e4b85bd 100644 --- a/src/vpkInstaller.Mod +++ b/src/vpkInstaller.Mod @@ -1,7 +1,7 @@ MODULE vpkInstaller; -IMPORT Out, StringList, vpkResolver, vpkdepTree, vpkDot, vpkSettings, vpkJsonDepRetriever; +IMPORT Out, StringList, vpkResolver, vpkdepTree, vpkDot, vpkSettings, vpkJsonDepRetriever, vpkSyncer; -PROCEDURE resolve*(VAR unit: ARRAY OF CHAR); +PROCEDURE resolve*(VAR unit: ARRAY OF CHAR): vpkdepTree.TdepTree; VAR tree: vpkdepTree.TdepTree; lst: StringList.TStringList; @@ -25,9 +25,26 @@ BEGIN Out.String(dep.name^); Out.Ln; INC(i) UNTIL i = tree.Count; - + RETURN tree END resolve; +PROCEDURE fetch*(VAR package, prefix, pkgTree: ARRAY OF CHAR); +VAR + depTree: vpkdepTree.TdepTree; + dep: vpkdepTree.Tdep; + i: LONGINT; + URI: ARRAY 128 OF CHAR; + typ: ARRAY 16 OF CHAR; +BEGIN + depTree := resolve(package); + i := 0; + REPEAT + dep := vpkdepTree.Get(depTree, i); + vpkJsonDepRetriever.getURIandType(dep, URI, typ); + vpkSyncer.fetch(dep.name^, URI, typ, prefix); + INC(i) + UNTIL i= depTree.Count; +END fetch; PROCEDURE build*(VAR package, prefix, tree: ARRAY OF CHAR); diff --git a/src/vpkJsonDepRetriever.Mod b/src/vpkJsonDepRetriever.Mod index 50e5d6e..71176c3 100644 --- a/src/vpkJsonDepRetriever.Mod +++ b/src/vpkJsonDepRetriever.Mod @@ -1,6 +1,42 @@ MODULE vpkJsonDepRetriever; IMPORT Out, StringList, strutils, vpkJsonParser, vpkStorage, vpkSettings, vpkdepTree; +PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep; VAR URI: ARRAY OF CHAR; VAR type: ARRAY OF CHAR); +VAR + jsonRecord, remote: vpkJsonParser.JsonTypePointer; + p: strutils.pstring; + k, v: StringList.pstring; + keys, values: StringList.TStringList; + i: LONGINT; +BEGIN + p := NIL; + vpkStorage.json2pstring(d.name^, p); + IF p # NIL THEN + jsonRecord := vpkJsonParser.Create(p^); + remote := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.rmtType); + IF remote # NIL THEN + keys := NIL; values := NIL; + remote.GetTerminalKeys(remote, keys); + remote.GetTerminalValues(remote, values); + i := 0; + REPEAT + k := keys.GetString(keys, i); + v := keys.GetString(values, i); + IF k^ = vpkSettings.rmtTypKey THEN COPY(v^, type) END; + IF k^ = vpkSettings.rmtTreeKey THEN COPY(v^, URI) END; + INC(i); + UNTIL i = keys.Count - 1; + ELSE + Out.String("malformed json: no 'Remote' section"); Out.Ln; + HALT(63); + END + ELSE + Out.String("no json file for "); Out.String(d.name^); Out.Ln; + Out.String("program is not expected to pass unexistent name, something is wrong in other module"); Out.Ln; + HALT(64); + END +END getURIandType; + (* returns -1 if no such dependency found, otherwise returns length of depstr string list *) PROCEDURE getDeps*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT; VAR @@ -28,7 +64,7 @@ BEGIN RETURN 0 END ELSE - RETURN -2 (* json doesn't contain 'type' key, malformed *) + RETURN -2 (* json doesn't contain 'Package' key, malformed *) END; ELSE RETURN -1 (* no such json file found *) @@ -36,4 +72,6 @@ BEGIN END getDeps; + + END vpkJsonDepRetriever. diff --git a/src/vpkJsonParser.Mod b/src/vpkJsonParser.Mod index 7f9c528..a599e91 100644 --- a/src/vpkJsonParser.Mod +++ b/src/vpkJsonParser.Mod @@ -197,6 +197,7 @@ BEGIN self.GetTerminal := GetTerminal; self.GetNonTerminal := GetNonTerminal; self.GetTerminalKeys := GetTerminalKeys; + self.GetTerminalValues := GetTerminalValues; self.GetNoneTerminalKeys := GetNoneTerminalKeys; NEW(characterStack); characterStack := vpkCharacterStack.Create(); diff --git a/src/vpkSettings.Mod b/src/vpkSettings.Mod index c0b799a..531b902 100644 --- a/src/vpkSettings.Mod +++ b/src/vpkSettings.Mod @@ -4,16 +4,20 @@ CONST vpkConfDir* = ".vipack"; vpkConfFile* = "vipackConf.json"; vpkTreeDir* = "vipackTree"; + vpkPkgDir* = "vpkLocal"; graphName* = "deps.dot"; - confTypKey* = "type"; - confTypGitVal* = "git"; - confTypHttpVal* = "http"; - confTreeKey* = "path"; + rmtType* = "Remote"; + rmtTypKey* = "type"; + rmtTypGitVal* = "git"; + rmtTypHttpVal* = "http"; + rmtTypHttpsVal* = "https"; + rmtTypGemiVal* = "gemini"; + rmtTreeKey* = "path"; defTreeVal* = "https://github.com/vishaps/vipackTree"; confTreeVal* = defTreeVal; - defTypVal* = confTypGitVal; + defTypVal* = rmtTypGitVal; pkgTypKey* = "Package"; depTypKey* = "Dependencies"; @@ -23,8 +27,10 @@ CONST port* = "80"; installPath* = "dependencies"; - http* = 0; - git* = 1; + http* = 0; + https* = 1; + gemini* = 2; + git* = 3; unkn* = -1; TYPE tree* = RECORD diff --git a/src/vpkSyncer.Mod b/src/vpkSyncer.Mod index b7b6ae1..4949c6e 100644 --- a/src/vpkSyncer.Mod +++ b/src/vpkSyncer.Mod @@ -22,4 +22,19 @@ BEGIN END; END sync; +PROCEDURE fetch*(name, url, typ, dst: ARRAY OF CHAR); +BEGIN + IF dst = "" THEN + vpkEnv.mkdefPkgDirPath(name, dst); + ELSE + vpkEnv.mkPkgDirPath(name, dst); + END; + + IF typ = vpkSettings.rmtTypGitVal THEN + vpkGit.fetchRepo(url, dst); + ELSE + Out.String("TODO: not a git url"); Out.Ln + END +END fetch; + END vpkSyncer.