mirror of
https://github.com/vishapoberon/vipak.git
synced 2026-07-09 19:03:31 +00:00
toml
This commit is contained in:
parent
be57b069f8
commit
be6d26d7f0
7 changed files with 555 additions and 18 deletions
|
|
@ -1,4 +1,4 @@
|
|||
DEPEND = github.com/norayr/unixFileSystem github.com/norayr/strutils github.com/norayr/base64 github.com/norayr/dbg github.com/norayr/Internet github.com/norayr/http github.com/norayr/mbedtls github.com/norayr/lists github.com/norayr/opts github.com/norayr/skprLogger codeberg.org/sts-q/vishaps-ssqJson
|
||||
DEPEND = github.com/norayr/unixFileSystem github.com/norayr/strutils github.com/norayr/base64 github.com/norayr/dbg github.com/norayr/Internet github.com/norayr/http github.com/norayr/mbedtls github.com/norayr/lists github.com/norayr/opts github.com/norayr/skprLogger codeberg.org/sts-q/vishaps-ssqJson github.com/norayr/toml
|
||||
|
||||
VOC = voc
|
||||
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||
|
|
@ -66,6 +66,8 @@ buildThis:
|
|||
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkDot.Mod
|
||||
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkResolver.Mod
|
||||
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkJsonDepRetriever.Mod
|
||||
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkTOMLDepRetriever.Mod
|
||||
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkMetaRetriever.Mod
|
||||
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkInstaller.Mod
|
||||
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkLocalBuilder.Mod
|
||||
cd $(BUILD) && $(VOC) $(mkfile_dir_path)/src/vipak.Mod -cm
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
MODULE vipak;
|
||||
IMPORT Texts, Strings, Oberon, Out,
|
||||
vpkConf, vpkLogger, vpkSyncer, vpkInstaller, vpkdepTree, opts, StringList,
|
||||
vpkLocalBuilder;
|
||||
vpkLocalBuilder, vpkMetaRetriever;
|
||||
|
||||
PROCEDURE msgnopkg(VAR options: opts.Options);
|
||||
BEGIN
|
||||
|
|
@ -11,7 +11,7 @@ END msgnopkg;
|
|||
|
||||
PROCEDURE main;
|
||||
VAR
|
||||
deps, sync, fetch, ask, local, init: BOOLEAN;
|
||||
deps, sync, fetch, ask, local, init, toml: BOOLEAN;
|
||||
package, prefix, pkgTree, localFile: ARRAY 128 OF CHAR;
|
||||
|
||||
options: opts.Options;
|
||||
|
|
@ -81,6 +81,14 @@ BEGIN
|
|||
opts.setOptRequired(opt, FALSE);
|
||||
options.add(options, opt);
|
||||
|
||||
opt := opts.createOpt();
|
||||
opts.setOptName(opt, "--toml");
|
||||
opts.setOptLName(opt, "--toml");
|
||||
opts.setOptHasVal(opt, FALSE);
|
||||
opts.setOptDesc(opt, "use .vipak file format instead of JSON");
|
||||
opts.setOptRequired(opt, FALSE);
|
||||
options.add(options, opt);
|
||||
|
||||
(* New local build options *)
|
||||
opt := opts.createOpt();
|
||||
opts.setOptName(opt, "-l");
|
||||
|
|
@ -110,7 +118,7 @@ BEGIN
|
|||
|
||||
COPY("", package); COPY("", prefix); COPY("", pkgTree); COPY("vipak.json", localFile);
|
||||
deps := FALSE; sync := FALSE; fetch := FALSE; ask := FALSE;
|
||||
local := FALSE; init := FALSE;
|
||||
local := FALSE; init := FALSE; toml := FALSE;
|
||||
|
||||
fopt := opts.createOpt();
|
||||
fopt := opts.findOpt("-d", foptions);
|
||||
|
|
@ -136,6 +144,15 @@ BEGIN
|
|||
fopt := opts.findOpt("-i", foptions);
|
||||
IF fopt # NIL THEN init := TRUE END;
|
||||
|
||||
fopt := opts.createOpt();
|
||||
fopt := opts.findOpt("--toml", foptions);
|
||||
IF fopt # NIL THEN toml := TRUE END;
|
||||
|
||||
IF toml THEN
|
||||
vpkMetaRetriever.SetPreferredFormat(vpkMetaRetriever.fmtToml);
|
||||
COPY("vipak.vipak", localFile)
|
||||
END;
|
||||
|
||||
opts.valOfOpt("-p", foptions, package);
|
||||
opts.valOfOpt("-P", foptions, prefix);
|
||||
IF prefix = "" THEN
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
MODULE vpkInstaller;
|
||||
IMPORT In, Out, Platform, Strings,
|
||||
List, StringList,
|
||||
vpkResolver, vpkdepTree, vpkDot, vpkEnv, vpkJsonDepRetriever,vpkSyncer,
|
||||
vpkResolver, vpkdepTree, vpkDot, vpkEnv, vpkMetaRetriever, vpkSyncer,
|
||||
vpkTools, vpkSettings;
|
||||
|
||||
PROCEDURE resolve*(VAR unit: ARRAY OF CHAR): vpkdepTree.TdepTree;
|
||||
|
|
@ -14,7 +14,7 @@ VAR
|
|||
BEGIN
|
||||
vpkEnv.getGraphName(graphName);
|
||||
Out.Ln; Out.String("resolving dependencies..."); Out.Ln;
|
||||
tree := vpkResolver.resolve(unit, vpkJsonDepRetriever.getDeps);
|
||||
tree := vpkResolver.resolve(unit, vpkMetaRetriever.getDeps);
|
||||
Out.String(" done! (:"); Out.Ln; Out.Ln;
|
||||
lst := vpkDot.tree2dot(tree);
|
||||
Out.String("dependency graph:"); Out.Ln;
|
||||
|
|
@ -61,7 +61,7 @@ BEGIN
|
|||
i := 0;
|
||||
REPEAT
|
||||
dep := vpkdepTree.Get(depTree, i);
|
||||
vpkJsonDepRetriever.getURIandType(dep);
|
||||
vpkMetaRetriever.getURIandType(dep);
|
||||
(* Pass build directory instead of prefix *)
|
||||
vpkSyncer.fetch(dep, builddir^);
|
||||
INC(i)
|
||||
|
|
@ -91,11 +91,11 @@ BEGIN
|
|||
i := 0;
|
||||
REPEAT
|
||||
dep := vpkdepTree.Get(depTree, i);
|
||||
vpkJsonDepRetriever.getURIandType(dep);
|
||||
vpkMetaRetriever.getURIandType(dep);
|
||||
(* Pass build directory instead of prefix *)
|
||||
vpkSyncer.fetch(dep, builddir^);
|
||||
b := FALSE;
|
||||
b := vpkJsonDepRetriever.getBuildInfo(dep, keys, values);
|
||||
b := vpkMetaRetriever.getBuildInfo(dep, keys, values);
|
||||
IF b THEN
|
||||
Out.String("Build info found for the package: "); Out.String(dep.name^); Out.Ln;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
MODULE vpkLocalBuilder;
|
||||
IMPORT Files, Out, Strings, Platform,
|
||||
Json, StringList, List, strUtils,
|
||||
vpkStorage, vpkSettings, vpkdepTree, vpkEnv, vpkJsonDepRetriever,
|
||||
TOML, vpkStorage, vpkSettings, vpkdepTree, vpkEnv, vpkMetaRetriever,
|
||||
vpkResolver, vpkSyncer, vpkDot, vpkTools, UnixFS;
|
||||
|
||||
CONST
|
||||
|
|
@ -243,6 +243,62 @@ BEGIN
|
|||
RETURN FALSE;
|
||||
END parseProjectFile;
|
||||
|
||||
PROCEDURE FileEndsWith(s, suffix: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR ls, lf, i: INTEGER;
|
||||
BEGIN
|
||||
ls := Strings.Length(s);
|
||||
lf := Strings.Length(suffix);
|
||||
IF lf > ls THEN RETURN FALSE END;
|
||||
i := 0;
|
||||
WHILE i < lf DO
|
||||
IF s[ls - lf + i] # suffix[i] THEN RETURN FALSE END;
|
||||
INC(i)
|
||||
END;
|
||||
RETURN TRUE
|
||||
END FileEndsWith;
|
||||
|
||||
PROCEDURE parseVipakProjectFile(VAR filename: ARRAY OF CHAR; VAR info: ProjectInfo): BOOLEAN;
|
||||
VAR
|
||||
content: strUtils.pstring;
|
||||
doc: TOML.Doc;
|
||||
sec: TOML.Section;
|
||||
secName: ARRAY 16 OF CHAR;
|
||||
keyName: ARRAY 16 OF CHAR;
|
||||
val: ARRAY 64 OF CHAR;
|
||||
BEGIN
|
||||
info.hasDeps := FALSE;
|
||||
info.hasBuild := FALSE;
|
||||
COPY("", info.name);
|
||||
COPY("", info.author);
|
||||
COPY("", info.license);
|
||||
COPY("", info.version);
|
||||
|
||||
vpkStorage.fileToString(filename, content);
|
||||
IF content = NIL THEN RETURN FALSE END;
|
||||
|
||||
doc := TOML.Parse(content^);
|
||||
|
||||
COPY("package", secName);
|
||||
sec := TOML.GetSection(doc, secName);
|
||||
IF sec # NIL THEN
|
||||
COPY("name", keyName); IF TOML.GetField(sec, keyName, val) THEN COPY(val, info.name) END;
|
||||
COPY("author", keyName); IF TOML.GetField(sec, keyName, val) THEN COPY(val, info.author) END;
|
||||
COPY("license", keyName); IF TOML.GetField(sec, keyName, val) THEN COPY(val, info.license) END;
|
||||
COPY("version", keyName); IF TOML.GetField(sec, keyName, val) THEN COPY(val, info.version) END
|
||||
END;
|
||||
|
||||
COPY("deps", secName);
|
||||
sec := TOML.GetSection(doc, secName);
|
||||
IF (sec # NIL) & (sec^.first # NIL) THEN info.hasDeps := TRUE END;
|
||||
|
||||
COPY("build", secName);
|
||||
sec := TOML.GetSection(doc, secName);
|
||||
IF sec # NIL THEN info.hasBuild := TRUE END;
|
||||
|
||||
IF info.name[0] = 0X THEN COPY("myproject", info.name) END;
|
||||
RETURN TRUE
|
||||
END parseVipakProjectFile;
|
||||
|
||||
PROCEDURE createBuildDir(): BOOLEAN;
|
||||
VAR
|
||||
fi: UnixFS.fileInfo;
|
||||
|
|
@ -276,14 +332,14 @@ VAR
|
|||
BEGIN
|
||||
Out.Ln; Out.String("resolving dependencies for local project..."); Out.Ln;
|
||||
|
||||
vpkJsonDepRetriever.setLocalProjectFile(projectFile);
|
||||
vpkMetaRetriever.setLocalProjectFile(projectFile);
|
||||
|
||||
COPY("local-project", projectName);
|
||||
localDep := vpkdepTree.CreateDep(projectName);
|
||||
|
||||
combinedTree := vpkdepTree.Create();
|
||||
|
||||
IF vpkJsonDepRetriever.getDepsFromFile(localDep, depsList) > 0 THEN
|
||||
IF vpkMetaRetriever.getDepsFromFile(localDep, depsList) > 0 THEN
|
||||
Out.String("Found "); Out.Int(depsList.Count, 0); Out.String(" direct dependencies"); Out.Ln;
|
||||
|
||||
i := 0;
|
||||
|
|
@ -291,7 +347,7 @@ BEGIN
|
|||
depName := depsList.GetString(depsList, i);
|
||||
IF depName # NIL THEN
|
||||
Out.String("Resolving: "); Out.String(depName^); Out.Ln;
|
||||
subTree := vpkResolver.resolve(depName^, vpkJsonDepRetriever.getDeps);
|
||||
subTree := vpkResolver.resolve(depName^, vpkMetaRetriever.getDeps);
|
||||
j := 0;
|
||||
REPEAT
|
||||
currentDep := vpkdepTree.Get(subTree, j);
|
||||
|
|
@ -385,12 +441,12 @@ BEGIN
|
|||
currentDep := vpkdepTree.Get(depTree, i);
|
||||
IF currentDep # NIL THEN
|
||||
Out.String("Fetching: "); Out.String(currentDep.name^); Out.Ln;
|
||||
vpkJsonDepRetriever.getURIandType(currentDep);
|
||||
vpkMetaRetriever.getURIandType(currentDep);
|
||||
vpkSyncer.fetch(currentDep, buildDir);
|
||||
|
||||
(* Now build the dependency *)
|
||||
Out.String("Building dependency: "); Out.String(currentDep.name^); Out.Ln;
|
||||
b := vpkJsonDepRetriever.getBuildInfo(currentDep, keys, values);
|
||||
b := vpkMetaRetriever.getBuildInfo(currentDep, keys, values);
|
||||
IF b & (keys # NIL) & (values # NIL) THEN
|
||||
Out.String("Build info found for dependency: "); Out.String(currentDep.name^); Out.Ln;
|
||||
|
||||
|
|
@ -480,7 +536,7 @@ VAR
|
|||
res, i: INTEGER;
|
||||
BEGIN
|
||||
dep := vpkdepTree.CreateDep(info.name);
|
||||
b := vpkJsonDepRetriever.getBuildInfoFromFile(dep, keys, values, projectFile);
|
||||
b := vpkMetaRetriever.getBuildInfoFromFile(dep, keys, values, projectFile);
|
||||
|
||||
IF b & (keys # NIL) & (values # NIL) THEN
|
||||
Out.String("Building project: "); Out.String(info.name); Out.Ln;
|
||||
|
|
@ -530,8 +586,12 @@ BEGIN
|
|||
HALT(1);
|
||||
END;
|
||||
|
||||
(* Parse project file *)
|
||||
b := parseProjectFile(projectFile, info);
|
||||
(* Parse project file - detect format by extension *)
|
||||
IF FileEndsWith(projectFile, ".vipak") THEN
|
||||
b := parseVipakProjectFile(projectFile, info)
|
||||
ELSE
|
||||
b := parseProjectFile(projectFile, info)
|
||||
END;
|
||||
IF ~b THEN
|
||||
Out.String("Failed to parse project file: "); Out.String(projectFile); Out.Ln;
|
||||
HALT(1);
|
||||
|
|
|
|||
76
src/vpkMetaRetriever.Mod
Normal file
76
src/vpkMetaRetriever.Mod
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
MODULE vpkMetaRetriever;
|
||||
|
||||
IMPORT
|
||||
StringList,
|
||||
vpkdepTree,
|
||||
vpkJsonDepRetriever,
|
||||
vpkTOMLDepRetriever;
|
||||
|
||||
CONST
|
||||
fmtAuto* = 0;
|
||||
fmtJson* = 1;
|
||||
fmtVipakfile* = 2;
|
||||
fmtToml* = 3;
|
||||
|
||||
VAR
|
||||
preferredFormat*: INTEGER;
|
||||
|
||||
PROCEDURE SetPreferredFormat*(fmt: INTEGER);
|
||||
BEGIN
|
||||
preferredFormat := fmt
|
||||
END SetPreferredFormat;
|
||||
|
||||
PROCEDURE setLocalProjectFile*(VAR filename: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
vpkJsonDepRetriever.setLocalProjectFile(filename);
|
||||
vpkTOMLDepRetriever.setLocalProjectFile(filename)
|
||||
END setLocalProjectFile;
|
||||
|
||||
PROCEDURE getDeps*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT;
|
||||
BEGIN
|
||||
IF preferredFormat = fmtToml THEN
|
||||
RETURN vpkTOMLDepRetriever.getDeps(d, depstrlist)
|
||||
ELSE (* fmtJson, fmtAuto, fmtVipakfile *)
|
||||
RETURN vpkJsonDepRetriever.getDeps(d, depstrlist)
|
||||
END
|
||||
END getDeps;
|
||||
|
||||
PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep);
|
||||
BEGIN
|
||||
IF preferredFormat = fmtToml THEN
|
||||
vpkTOMLDepRetriever.getURIandType(d)
|
||||
ELSE
|
||||
vpkJsonDepRetriever.getURIandType(d)
|
||||
END
|
||||
END getURIandType;
|
||||
|
||||
PROCEDURE getBuildInfo*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TStringList): BOOLEAN;
|
||||
BEGIN
|
||||
IF preferredFormat = fmtToml THEN
|
||||
RETURN vpkTOMLDepRetriever.getBuildInfo(d, k, v)
|
||||
ELSE
|
||||
RETURN vpkJsonDepRetriever.getBuildInfo(d, k, v)
|
||||
END
|
||||
END getBuildInfo;
|
||||
|
||||
PROCEDURE getDepsFromFile*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT;
|
||||
BEGIN
|
||||
IF preferredFormat = fmtToml THEN
|
||||
RETURN vpkTOMLDepRetriever.getDepsFromFile(d, depstrlist)
|
||||
ELSE
|
||||
RETURN vpkJsonDepRetriever.getDepsFromFile(d, depstrlist)
|
||||
END
|
||||
END getDepsFromFile;
|
||||
|
||||
PROCEDURE getBuildInfoFromFile*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TStringList; VAR filename: ARRAY OF CHAR): BOOLEAN;
|
||||
BEGIN
|
||||
IF preferredFormat = fmtToml THEN
|
||||
RETURN vpkTOMLDepRetriever.getBuildInfoFromFile(d, k, v, filename)
|
||||
ELSE
|
||||
RETURN vpkJsonDepRetriever.getBuildInfoFromFile(d, k, v, filename)
|
||||
END
|
||||
END getBuildInfoFromFile;
|
||||
|
||||
BEGIN
|
||||
preferredFormat := fmtJson
|
||||
END vpkMetaRetriever.
|
||||
|
|
@ -268,4 +268,92 @@ BEGIN
|
|||
END
|
||||
END json2pstring;
|
||||
|
||||
PROCEDURE findPackageVipakPath*(pkgName, reqVersion: ARRAY OF CHAR; VAR path: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR
|
||||
dirPath, fullPath, currentVersion, bestVersion: ARRAY 512 OF CHAR;
|
||||
lst: UnixFS.list;
|
||||
i: INTEGER;
|
||||
found: BOOLEAN;
|
||||
emptyVersion, vipakSuffix: ARRAY 16 OF CHAR;
|
||||
stem, base: ARRAY 512 OF CHAR;
|
||||
pkgPrefix: ARRAY 512 OF CHAR;
|
||||
lp, ls, iv: INTEGER;
|
||||
BEGIN
|
||||
COPY("", path);
|
||||
COPY("", bestVersion);
|
||||
COPY("", emptyVersion);
|
||||
COPY(".vipak", vipakSuffix);
|
||||
found := FALSE;
|
||||
|
||||
vpkEnv.getTreeDir(dirPath);
|
||||
Strings.Append("/", dirPath);
|
||||
Strings.Append(pkgName, dirPath);
|
||||
|
||||
IF ~UnixFS.ExistsByName(dirPath) THEN RETURN FALSE END;
|
||||
|
||||
UnixFS.ListDir(dirPath, lst);
|
||||
IF lst = NIL THEN RETURN FALSE END;
|
||||
|
||||
COPY(pkgName, pkgPrefix);
|
||||
Strings.Append("-", pkgPrefix);
|
||||
lp := Strings.Length(pkgPrefix);
|
||||
|
||||
i := 0;
|
||||
WHILE i < LEN(lst^) DO
|
||||
IF (lst^[i].name # ".") & (lst^[i].name # "..") THEN
|
||||
IF EndsWith(lst^[i].name, vipakSuffix) THEN
|
||||
COPY(dirPath, fullPath);
|
||||
Strings.Append("/", fullPath);
|
||||
Strings.Append(lst^[i].name, fullPath);
|
||||
(* Extract version from filename: pkgname-version.vipak *)
|
||||
BaseName(fullPath, base);
|
||||
IF StripSuffix(base, vipakSuffix, stem) THEN
|
||||
ls := Strings.Length(stem);
|
||||
IF ls > lp THEN
|
||||
iv := 0;
|
||||
WHILE iv < lp DO
|
||||
IF stem[iv] # pkgPrefix[iv] THEN iv := lp + 1 END; (* mismatch *)
|
||||
INC(iv)
|
||||
END;
|
||||
IF iv = lp THEN
|
||||
(* prefix matches, remainder is version - copy char by char *)
|
||||
iv := 0;
|
||||
WHILE stem[lp + iv] # 0X DO
|
||||
currentVersion[iv] := stem[lp + iv]; INC(iv)
|
||||
END;
|
||||
currentVersion[iv] := 0X;
|
||||
IF currentVersion # emptyVersion THEN
|
||||
IF reqVersion # emptyVersion THEN
|
||||
IF currentVersion = reqVersion THEN
|
||||
COPY(fullPath, path);
|
||||
RETURN TRUE
|
||||
END
|
||||
ELSE
|
||||
IF ~found OR (CompareVersions(bestVersion, currentVersion) < 0) THEN
|
||||
COPY(currentVersion, bestVersion);
|
||||
COPY(fullPath, path);
|
||||
found := TRUE
|
||||
END
|
||||
END
|
||||
END
|
||||
END
|
||||
END
|
||||
END
|
||||
END
|
||||
END;
|
||||
INC(i)
|
||||
END;
|
||||
RETURN found
|
||||
END findPackageVipakPath;
|
||||
|
||||
PROCEDURE vipak2pstring*(pkgName, reqVersion: ARRAY OF CHAR; VAR pstr: strUtils.pstring);
|
||||
VAR
|
||||
path: ARRAY 512 OF CHAR;
|
||||
BEGIN
|
||||
pstr := NIL;
|
||||
IF findPackageVipakPath(pkgName, reqVersion, path) THEN
|
||||
fileToString(path, pstr)
|
||||
END
|
||||
END vipak2pstring;
|
||||
|
||||
END vpkStorage.
|
||||
|
|
|
|||
294
src/vpkTOMLDepRetriever.Mod
Normal file
294
src/vpkTOMLDepRetriever.Mod
Normal file
|
|
@ -0,0 +1,294 @@
|
|||
MODULE vpkTOMLDepRetriever;
|
||||
|
||||
IMPORT
|
||||
Out, Strings,
|
||||
List, StringList, strUtils,
|
||||
TOML, vpkStorage, vpkSettings, vpkdepTree;
|
||||
|
||||
VAR
|
||||
currentLocalProjectFile: ARRAY 256 OF CHAR;
|
||||
|
||||
(* Split a build step on the last space: cmd = everything before, file = last token *)
|
||||
PROCEDURE SplitLastSpace(VAR step: ARRAY OF CHAR; VAR cmd, file: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR i, l, lastSp: INTEGER;
|
||||
BEGIN
|
||||
l := Strings.Length(step);
|
||||
lastSp := -1;
|
||||
i := 0;
|
||||
WHILE i < l DO
|
||||
IF (step[i] = " ") OR (step[i] = 09X) THEN lastSp := i END;
|
||||
INC(i)
|
||||
END;
|
||||
IF lastSp < 0 THEN RETURN FALSE END;
|
||||
i := 0;
|
||||
WHILE i < lastSp DO cmd[i] := step[i]; INC(i) END;
|
||||
cmd[i] := 0X;
|
||||
TOML.TrimRight(cmd);
|
||||
i := lastSp + 1; l := 0;
|
||||
WHILE step[i] # 0X DO file[l] := step[i]; INC(i); INC(l) END;
|
||||
file[l] := 0X;
|
||||
TOML.TrimLeft(file);
|
||||
RETURN (cmd[0] # 0X) & (file[0] # 0X)
|
||||
END SplitLastSpace;
|
||||
|
||||
(* Split run value on newlines and ; into (cmd, file) pairs *)
|
||||
PROCEDURE ParseBuildRun(VAR run: ARRAY OF CHAR; VAR k, v: StringList.TStringList): BOOLEAN;
|
||||
VAR
|
||||
i, j, l: INTEGER;
|
||||
ch: CHAR;
|
||||
step, cmd, file: ARRAY 512 OF CHAR;
|
||||
done: BOOLEAN;
|
||||
BEGIN
|
||||
k := NIL; v := NIL;
|
||||
l := Strings.Length(run);
|
||||
i := 0; j := 0;
|
||||
step[0] := 0X;
|
||||
done := FALSE;
|
||||
WHILE ~done DO
|
||||
IF i >= l THEN
|
||||
ch := 0X; done := TRUE
|
||||
ELSE
|
||||
ch := run[i]; INC(i)
|
||||
END;
|
||||
IF (ch = 0AX) OR (ch = ";") OR (ch = 0X) THEN
|
||||
step[j] := 0X;
|
||||
TOML.Trim(step);
|
||||
IF step[0] # 0X THEN
|
||||
IF SplitLastSpace(step, cmd, file) THEN
|
||||
IF k = NIL THEN k := StringList.Create() END;
|
||||
IF v = NIL THEN v := StringList.Create() END;
|
||||
k.AppendString(k, cmd);
|
||||
v.AppendString(v, file)
|
||||
END
|
||||
END;
|
||||
j := 0; step[0] := 0X
|
||||
ELSE
|
||||
IF j < 511 THEN step[j] := ch; INC(j) END
|
||||
END
|
||||
END;
|
||||
RETURN (k # NIL) & (k.Count > 0)
|
||||
END ParseBuildRun;
|
||||
|
||||
PROCEDURE getDepsFromContent(VAR content: ARRAY OF CHAR; VAR depstrlist: StringList.TStringList): LONGINT;
|
||||
VAR
|
||||
doc: TOML.Doc;
|
||||
sec: TOML.Section;
|
||||
fld: TOML.Field;
|
||||
spec: ARRAY 256 OF CHAR;
|
||||
secName: ARRAY 16 OF CHAR;
|
||||
BEGIN
|
||||
depstrlist := NIL;
|
||||
doc := TOML.Parse(content);
|
||||
COPY("deps", secName);
|
||||
sec := TOML.GetSection(doc, secName);
|
||||
IF sec = NIL THEN RETURN 0 END;
|
||||
fld := sec^.first;
|
||||
WHILE fld # NIL DO
|
||||
IF fld^.key[0] # 0X THEN
|
||||
IF fld^.value[0] # 0X THEN
|
||||
COPY(fld^.key, spec);
|
||||
Strings.Append(":", spec);
|
||||
Strings.Append(fld^.value, spec)
|
||||
ELSE
|
||||
COPY(fld^.key, spec)
|
||||
END;
|
||||
IF depstrlist = NIL THEN depstrlist := StringList.Create() END;
|
||||
depstrlist.AppendString(depstrlist, spec)
|
||||
END;
|
||||
fld := fld^.next
|
||||
END;
|
||||
IF depstrlist = NIL THEN RETURN 0 END;
|
||||
RETURN depstrlist.Count
|
||||
END getDepsFromContent;
|
||||
|
||||
PROCEDURE getURIandTypeFromContent(VAR content: ARRAY OF CHAR; VAR d: vpkdepTree.Tdep): BOOLEAN;
|
||||
VAR
|
||||
doc: TOML.Doc;
|
||||
sec: TOML.Section;
|
||||
typ: ARRAY 32 OF CHAR;
|
||||
uri: ARRAY 512 OF CHAR;
|
||||
tag: ARRAY 64 OF CHAR;
|
||||
md5: ARRAY 34 OF CHAR;
|
||||
authtype: ARRAY 32 OF CHAR;
|
||||
user: ARRAY 32 OF CHAR;
|
||||
pass: ARRAY 32 OF CHAR;
|
||||
typLow: ARRAY 32 OF CHAR;
|
||||
atLow: ARRAY 32 OF CHAR;
|
||||
gitRemote: vpkdepTree.RemoteGit;
|
||||
httpsRemote: vpkdepTree.RemoteHttps;
|
||||
httpRemote: vpkdepTree.RemoteHttp;
|
||||
httpsFile: vpkdepTree.File;
|
||||
secName: ARRAY 16 OF CHAR;
|
||||
keyName: ARRAY 16 OF CHAR;
|
||||
BEGIN
|
||||
doc := TOML.Parse(content);
|
||||
COPY("remote", secName);
|
||||
sec := TOML.GetSection(doc, secName);
|
||||
IF sec = NIL THEN RETURN FALSE END;
|
||||
|
||||
COPY("", typ);
|
||||
COPY("type", keyName); IF ~TOML.GetField(sec, keyName, typ) THEN END;
|
||||
COPY(typ, typLow); TOML.ToLower(typLow);
|
||||
|
||||
IF typLow = "git" THEN
|
||||
COPY("", uri); COPY("", tag);
|
||||
COPY("uri", keyName);
|
||||
IF ~TOML.GetField(sec, keyName, uri) THEN
|
||||
COPY("path", keyName); IF ~TOML.GetField(sec, keyName, uri) THEN END
|
||||
END;
|
||||
COPY("tag", keyName); IF ~TOML.GetField(sec, keyName, tag) THEN END;
|
||||
NEW(gitRemote);
|
||||
d^.rmt := gitRemote;
|
||||
d^.Type := vpkSettings.git;
|
||||
COPY(uri, gitRemote^.URI);
|
||||
COPY(tag, gitRemote^.tag);
|
||||
gitRemote^.branch[0] := 0X;
|
||||
RETURN TRUE
|
||||
|
||||
ELSIF typLow = "https" THEN
|
||||
NEW(httpsRemote);
|
||||
d^.rmt := httpsRemote;
|
||||
d^.Type := vpkSettings.https;
|
||||
httpsRemote^.Files := List.Create();
|
||||
WHILE sec # NIL DO
|
||||
COPY("", uri); COPY("", md5); COPY("", authtype); COPY("", user); COPY("", pass);
|
||||
COPY("uri", keyName); IF ~TOML.GetField(sec, keyName, uri) THEN END;
|
||||
COPY("md5", keyName); IF ~TOML.GetField(sec, keyName, md5) THEN END;
|
||||
COPY("authtype", keyName); IF ~TOML.GetField(sec, keyName, authtype) THEN END;
|
||||
COPY("user", keyName); IF ~TOML.GetField(sec, keyName, user) THEN END;
|
||||
COPY("password", keyName); IF ~TOML.GetField(sec, keyName, pass) THEN END;
|
||||
IF uri[0] # 0X THEN
|
||||
NEW(httpsFile);
|
||||
COPY(uri, httpsFile^.URI);
|
||||
COPY(md5, httpsFile^.md5);
|
||||
COPY(authtype, atLow); TOML.ToLower(atLow);
|
||||
IF atLow = "basicauth" THEN
|
||||
httpsFile^.auth := TRUE;
|
||||
COPY(user, httpsFile^.username);
|
||||
COPY(pass, httpsFile^.password)
|
||||
ELSE
|
||||
httpsFile^.auth := FALSE
|
||||
END;
|
||||
httpsRemote^.Files.Append(httpsRemote^.Files, httpsFile)
|
||||
END;
|
||||
sec := TOML.GetNextSection(sec, secName)
|
||||
END;
|
||||
RETURN TRUE
|
||||
|
||||
ELSIF typLow = "http" THEN
|
||||
NEW(httpRemote);
|
||||
d^.rmt := httpRemote;
|
||||
d^.Type := vpkSettings.http;
|
||||
httpRemote^.Files := List.Create();
|
||||
WHILE sec # NIL DO
|
||||
COPY("", uri); COPY("", md5); COPY("", authtype); COPY("", user); COPY("", pass);
|
||||
COPY("uri", keyName); IF ~TOML.GetField(sec, keyName, uri) THEN END;
|
||||
COPY("md5", keyName); IF ~TOML.GetField(sec, keyName, md5) THEN END;
|
||||
COPY("authtype", keyName); IF ~TOML.GetField(sec, keyName, authtype) THEN END;
|
||||
COPY("user", keyName); IF ~TOML.GetField(sec, keyName, user) THEN END;
|
||||
COPY("password", keyName); IF ~TOML.GetField(sec, keyName, pass) THEN END;
|
||||
IF uri[0] # 0X THEN
|
||||
NEW(httpsFile);
|
||||
COPY(uri, httpsFile^.URI);
|
||||
COPY(md5, httpsFile^.md5);
|
||||
COPY(authtype, atLow); TOML.ToLower(atLow);
|
||||
IF atLow = "basicauth" THEN
|
||||
httpsFile^.auth := TRUE;
|
||||
COPY(user, httpsFile^.username);
|
||||
COPY(pass, httpsFile^.password)
|
||||
ELSE
|
||||
httpsFile^.auth := FALSE
|
||||
END;
|
||||
httpRemote^.Files.Append(httpRemote^.Files, httpsFile)
|
||||
END;
|
||||
sec := TOML.GetNextSection(sec, secName)
|
||||
END;
|
||||
RETURN TRUE
|
||||
END;
|
||||
|
||||
Out.String("vpkTOMLDepRetriever: unsupported remote type: "); Out.String(typ); Out.Ln;
|
||||
RETURN FALSE
|
||||
END getURIandTypeFromContent;
|
||||
|
||||
PROCEDURE getBuildInfoFromContent(VAR content: ARRAY OF CHAR; VAR k, v: StringList.TStringList): BOOLEAN;
|
||||
VAR
|
||||
doc: TOML.Doc;
|
||||
sec: TOML.Section;
|
||||
run: ARRAY 4096 OF CHAR;
|
||||
secName, keyName: ARRAY 16 OF CHAR;
|
||||
BEGIN
|
||||
k := NIL; v := NIL;
|
||||
doc := TOML.Parse(content);
|
||||
COPY("build", secName);
|
||||
sec := TOML.GetSection(doc, secName);
|
||||
IF sec = NIL THEN RETURN FALSE END;
|
||||
COPY("run", keyName);
|
||||
IF ~TOML.GetField(sec, keyName, run) THEN RETURN FALSE END;
|
||||
RETURN ParseBuildRun(run, k, v)
|
||||
END getBuildInfoFromContent;
|
||||
|
||||
PROCEDURE getDeps*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT;
|
||||
VAR content: strUtils.pstring;
|
||||
BEGIN
|
||||
depstrlist := NIL;
|
||||
vpkStorage.vipak2pstring(d.name^, d.version, content);
|
||||
IF content = NIL THEN
|
||||
Out.String("No .vipak file found for: "); Out.String(d.name^); Out.Ln;
|
||||
RETURN -1
|
||||
END;
|
||||
RETURN getDepsFromContent(content^, depstrlist)
|
||||
END getDeps;
|
||||
|
||||
PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep);
|
||||
VAR content: strUtils.pstring;
|
||||
BEGIN
|
||||
vpkStorage.vipak2pstring(d.name^, d.version, content);
|
||||
IF content = NIL THEN
|
||||
Out.String("No .vipak file found for: "); Out.String(d.name^); Out.Ln;
|
||||
RETURN
|
||||
END;
|
||||
IF ~getURIandTypeFromContent(content^, d) THEN
|
||||
Out.String("Failed to get remote info from .vipak for: "); Out.String(d.name^); Out.Ln
|
||||
END
|
||||
END getURIandType;
|
||||
|
||||
PROCEDURE getBuildInfo*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TStringList): BOOLEAN;
|
||||
VAR content: strUtils.pstring;
|
||||
BEGIN
|
||||
vpkStorage.vipak2pstring(d.name^, d.version, content);
|
||||
IF content = NIL THEN k := NIL; v := NIL; RETURN FALSE END;
|
||||
RETURN getBuildInfoFromContent(content^, k, v)
|
||||
END getBuildInfo;
|
||||
|
||||
PROCEDURE setLocalProjectFile*(VAR filename: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
COPY(filename, currentLocalProjectFile)
|
||||
END setLocalProjectFile;
|
||||
|
||||
PROCEDURE getDepsFromFile*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT;
|
||||
VAR
|
||||
content: strUtils.pstring;
|
||||
filename: ARRAY 256 OF CHAR;
|
||||
BEGIN
|
||||
depstrlist := NIL;
|
||||
IF currentLocalProjectFile[0] = 0X THEN
|
||||
COPY("vipak.vipak", filename)
|
||||
ELSE
|
||||
COPY(currentLocalProjectFile, filename)
|
||||
END;
|
||||
vpkStorage.fileToString(filename, content);
|
||||
IF content = NIL THEN RETURN -1 END;
|
||||
RETURN getDepsFromContent(content^, depstrlist)
|
||||
END getDepsFromFile;
|
||||
|
||||
PROCEDURE getBuildInfoFromFile*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TStringList; VAR filename: ARRAY OF CHAR): BOOLEAN;
|
||||
VAR content: strUtils.pstring;
|
||||
BEGIN
|
||||
vpkStorage.fileToString(filename, content);
|
||||
IF content = NIL THEN k := NIL; v := NIL; RETURN FALSE END;
|
||||
RETURN getBuildInfoFromContent(content^, k, v)
|
||||
END getBuildInfoFromFile;
|
||||
|
||||
BEGIN
|
||||
currentLocalProjectFile[0] := 0X
|
||||
END vpkTOMLDepRetriever.
|
||||
Loading…
Add table
Add a link
Reference in a new issue