mirror of
https://github.com/vishapoberon/vipak.git
synced 2026-04-05 20:42:26 +00:00
fetch works
This commit is contained in:
parent
c95ecfc60b
commit
4dfb4975ff
9 changed files with 171 additions and 41 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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,34 +159,40 @@ 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.createOpt();
|
||||||
fopt := opts.findOpt("-s", foptions);
|
fopt := opts.findOpt("-f", foptions);
|
||||||
IF fopt # NIL THEN sync := TRUE END;
|
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, 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
|
|
||||||
Out.String("you need to mention package name to resolve dependencies for it"); Out.Ln; Out.Ln;
|
|
||||||
opts.showHelp(options);
|
|
||||||
END
|
|
||||||
ELSE
|
ELSE
|
||||||
|
IF package # "" THEN
|
||||||
vpkInstaller.build(package, prefix, tree)
|
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;
|
||||||
|
|
||||||
END main;
|
END main;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
|
|
@ -23,8 +27,10 @@ CONST
|
||||||
port* = "80";
|
port* = "80";
|
||||||
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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue