fetch works

This commit is contained in:
Norayr Chilingarian 2022-01-14 05:19:50 +04:00
parent c95ecfc60b
commit 4dfb4975ff
9 changed files with 171 additions and 41 deletions

View file

@ -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

View file

@ -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.

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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.

View file

@ -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();

View file

@ -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

View file

@ -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.