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);
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue