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); Strings.Append(vpkSettings.vpkConfDir, path);
END mkConfDirPath; 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; PROCEDURE setConfFileName;
VAR VAR
home: ARRAY 128 OF CHAR; home: ARRAY 128 OF CHAR;
@ -65,6 +84,16 @@ BEGIN
Strings.Append(vpkSettings.vpkTreeDir, path); Strings.Append(vpkSettings.vpkTreeDir, path);
END getTreeDir; 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*; PROCEDURE checkEnv*;
VAR VAR
file : vpkFiles.fileInfo; file : vpkFiles.fileInfo;
@ -91,11 +120,7 @@ BEGIN
Strings.Append('/', tmp); Strings.Append('/', tmp);
Strings.Append(vpkSettings.vpkTreeDir, tmp); Strings.Append(vpkSettings.vpkTreeDir, tmp);
file.name := tmp; file.name := tmp;
IF ~vpkFiles.Exists(file) THEN createIfNotThere(file);
IF ~vpkFiles.mkDir(file.name) THEN
Out.String("failed to create tree dir "); Out.String(tmp); Out.Ln; HALT(1);
END;
END;
END checkEnv; END checkEnv;
BEGIN BEGIN

View file

@ -25,4 +25,9 @@ BEGIN
pull(url, tmp); pull(url, tmp);
END syncTree; END syncTree;
PROCEDURE fetchRepo*(url: ARRAY OF CHAR; dst: ARRAY OF CHAR);
BEGIN
pull(url, dst);
END fetchRepo;
END vpkGit. END vpkGit.

View file

@ -1,6 +1,6 @@
MODULE vipack; MODULE vipack;
IMPORT Texts, Strings, Oberon, Out, 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); PROCEDURE processArgs(VAR package, prefix, tree: ARRAY OF CHAR; deps, sync: BOOLEAN);
VAR VAR
@ -80,14 +80,23 @@ BEGIN
END processArgs; 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; PROCEDURE main;
VAR VAR
deps, sync: BOOLEAN; deps, sync, fetch: BOOLEAN;
package, prefix, tree: ARRAY 64 OF CHAR; package, prefix, pkgTree: ARRAY 128 OF CHAR;
options: opts.Options; options: opts.Options;
foptions: opts.Options; foptions: opts.Options;
opt, fopt: opts.Option; opt, fopt: opts.Option;
depTree: vpkdepTree.TdepTree;
BEGIN BEGIN
options := opts.createOptions(); options := opts.createOptions();
foptions := opts.createOptions(); foptions := opts.createOptions();
@ -108,6 +117,14 @@ BEGIN
opts.setOptRequired(opt, FALSE); opts.setOptRequired(opt, FALSE);
options.add(options, opt); 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(); opt := opts.createOpt();
opts.setOptName(opt, "-s"); opts.setOptName(opt, "-s");
opts.setOptLName(opt, "--sync"); opts.setOptLName(opt, "--sync");
@ -142,13 +159,17 @@ BEGIN
END; END;
Out.Ln; Out.Ln;
COPY("", package); COPY("", prefix); COPY("", tree); COPY("", package); COPY("", prefix); COPY("", pkgTree);
deps := FALSE; sync := FALSE; deps := FALSE; sync := FALSE;
fopt := opts.createOpt(); fopt := opts.createOpt();
fopt := opts.findOpt("-d", foptions); fopt := opts.findOpt("-d", foptions);
IF fopt # NIL THEN deps := TRUE END; IF fopt # NIL THEN deps := TRUE END;
fopt := opts.createOpt();
fopt := opts.findOpt("-f", foptions);
IF fopt # NIL THEN fetch := TRUE END;
fopt := opts.createOpt(); fopt := opts.createOpt();
fopt := opts.findOpt("-s", foptions); fopt := opts.findOpt("-s", foptions);
IF fopt # NIL THEN sync := TRUE END; IF fopt # NIL THEN sync := TRUE END;
@ -156,20 +177,22 @@ BEGIN
opts.valOfOpt("-p", foptions, package); opts.valOfOpt("-p", foptions, package);
opts.valOfOpt("-P", foptions, prefix); opts.valOfOpt("-P", foptions, prefix);
opts.valOfOpt("-t", foptions, tree); opts.valOfOpt("-t", foptions, pkgTree);
IF sync THEN IF sync THEN
vpkSyncer.sync vpkSyncer.sync
ELSIF deps THEN
IF package # "" THEN
vpkInstaller.resolve(package);
ELSE ELSE
Out.String("you need to mention package name to resolve dependencies for it"); Out.Ln; Out.Ln; IF package # "" THEN
opts.showHelp(options); IF deps THEN
depTree := vpkInstaller.resolve(package)
ELSIF fetch THEN
vpkInstaller.fetch(package, prefix, pkgTree)
ELSE
vpkInstaller.build(package, prefix, pkgTree)
END END
ELSE ELSE
msgnopkg(options)
vpkInstaller.build(package, prefix, tree) END
END; END;
END main; END main;

View file

@ -15,11 +15,11 @@ PROCEDURE mkConfContent(VAR path: ARRAY OF CHAR);
BEGIN BEGIN
COPY("", path); COPY("", path);
Strings.Append(open, path); Strings.Append(open, path);
Strings.Append(vpkSettings.confTreeKey, path); Strings.Append(vpkSettings.rmtTreeKey, path);
Strings.Append(is, path); Strings.Append(is, path);
Strings.Append(vpkSettings.defTreeVal, path); Strings.Append(vpkSettings.defTreeVal, path);
Strings.Append(newkey, path); Strings.Append(newkey, path);
Strings.Append(vpkSettings.confTypKey, path); Strings.Append(vpkSettings.rmtTypKey, path);
Strings.Append(is, path); Strings.Append(is, path);
Strings.Append(vpkSettings.defTypVal, path); Strings.Append(vpkSettings.defTypVal, path);
Strings.Append(close, 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; WHILE ~ r.eof & (i < LEN(dt)) DO Files.Read(r, ch); dt[i] := ch; INC(i) END;
Files.Close(f); Files.Close(f);
jsonRecord := vpkJsonParser.Create(dt); jsonRecord := vpkJsonParser.Create(dt);
b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.confTreeKey, tree.url); b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.rmtTreeKey, tree.url);
IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.confTreeKey); Out.String(" from json"); Out.Ln; HALT(1); END; 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.confTypKey, treeTyp); b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.rmtTypKey, treeTyp);
IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.confTypKey); Out.String(" from json"); Out.Ln; HALT(1); END; IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.rmtTypKey); Out.String(" from json"); Out.Ln; HALT(1); END;
IF treeTyp = vpkSettings.confTypGitVal THEN IF treeTyp = vpkSettings.rmtTypGitVal THEN
tree.typ := vpkSettings.git; tree.typ := vpkSettings.git;
ELSIF treeTyp = vpkSettings.confTypHttpVal THEN ELSIF treeTyp = vpkSettings.rmtTypHttpVal THEN
tree.typ := vpkSettings.http tree.typ := vpkSettings.http
ELSE ELSE
tree.typ := vpkSettings.unkn; tree.typ := vpkSettings.unkn;

View file

@ -1,7 +1,7 @@
MODULE vpkInstaller; 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 VAR
tree: vpkdepTree.TdepTree; tree: vpkdepTree.TdepTree;
lst: StringList.TStringList; lst: StringList.TStringList;
@ -25,9 +25,26 @@ BEGIN
Out.String(dep.name^); Out.Ln; Out.String(dep.name^); Out.Ln;
INC(i) INC(i)
UNTIL i = tree.Count; UNTIL i = tree.Count;
RETURN tree
END resolve; 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); PROCEDURE build*(VAR package, prefix, tree: ARRAY OF CHAR);

View file

@ -1,6 +1,42 @@
MODULE vpkJsonDepRetriever; MODULE vpkJsonDepRetriever;
IMPORT Out, StringList, strutils, vpkJsonParser, vpkStorage, vpkSettings, vpkdepTree; 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 *) (* 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; PROCEDURE getDeps*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT;
VAR VAR
@ -28,7 +64,7 @@ BEGIN
RETURN 0 RETURN 0
END END
ELSE ELSE
RETURN -2 (* json doesn't contain 'type' key, malformed *) RETURN -2 (* json doesn't contain 'Package' key, malformed *)
END; END;
ELSE ELSE
RETURN -1 (* no such json file found *) RETURN -1 (* no such json file found *)
@ -36,4 +72,6 @@ BEGIN
END getDeps; END getDeps;
END vpkJsonDepRetriever. END vpkJsonDepRetriever.

View file

@ -197,6 +197,7 @@ BEGIN
self.GetTerminal := GetTerminal; self.GetTerminal := GetTerminal;
self.GetNonTerminal := GetNonTerminal; self.GetNonTerminal := GetNonTerminal;
self.GetTerminalKeys := GetTerminalKeys; self.GetTerminalKeys := GetTerminalKeys;
self.GetTerminalValues := GetTerminalValues;
self.GetNoneTerminalKeys := GetNoneTerminalKeys; self.GetNoneTerminalKeys := GetNoneTerminalKeys;
NEW(characterStack); NEW(characterStack);
characterStack := vpkCharacterStack.Create(); characterStack := vpkCharacterStack.Create();

View file

@ -4,16 +4,20 @@ CONST
vpkConfDir* = ".vipack"; vpkConfDir* = ".vipack";
vpkConfFile* = "vipackConf.json"; vpkConfFile* = "vipackConf.json";
vpkTreeDir* = "vipackTree"; vpkTreeDir* = "vipackTree";
vpkPkgDir* = "vpkLocal";
graphName* = "deps.dot"; graphName* = "deps.dot";
confTypKey* = "type"; rmtType* = "Remote";
confTypGitVal* = "git"; rmtTypKey* = "type";
confTypHttpVal* = "http"; rmtTypGitVal* = "git";
confTreeKey* = "path"; rmtTypHttpVal* = "http";
rmtTypHttpsVal* = "https";
rmtTypGemiVal* = "gemini";
rmtTreeKey* = "path";
defTreeVal* = "https://github.com/vishaps/vipackTree"; defTreeVal* = "https://github.com/vishaps/vipackTree";
confTreeVal* = defTreeVal; confTreeVal* = defTreeVal;
defTypVal* = confTypGitVal; defTypVal* = rmtTypGitVal;
pkgTypKey* = "Package"; pkgTypKey* = "Package";
depTypKey* = "Dependencies"; depTypKey* = "Dependencies";
@ -24,7 +28,9 @@ CONST
installPath* = "dependencies"; installPath* = "dependencies";
http* = 0; http* = 0;
git* = 1; https* = 1;
gemini* = 2;
git* = 3;
unkn* = -1; unkn* = -1;
TYPE TYPE
tree* = RECORD tree* = RECORD

View file

@ -22,4 +22,19 @@ BEGIN
END; END;
END sync; 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. END vpkSyncer.