Merge pull request #2 from vishaps/json_refactor

Json refactor
This commit is contained in:
Norayr Chilingarian 2024-02-01 23:00:50 +00:00 committed by GitHub
commit 049495a336
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 377 additions and 158 deletions

View file

@ -1,4 +1,4 @@
DEPEND = github.com/norayr/lists github.com/norayr/Internet github.com/norayr/opts github.com/norayr/skprLogger github.com/norayr/skprJson codeberg.org/sts-q/vishaps-ssqJson DEPEND = github.com/norayr/dbg github.com/norayr/strutils github.com/norayr/Internet github.com/norayr/http github.com/norayr/lists github.com/norayr/opts github.com/norayr/skprLogger github.com/norayr/skprJson codeberg.org/sts-q/vishaps-ssqJson
VOC = /opt/voc/bin/voc VOC = /opt/voc/bin/voc
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
@ -19,28 +19,28 @@ all: get_deps build_deps buildThis
get_deps: get_deps:
@for i in $(DEPEND); do \ @for i in $(DEPEND); do \
if [ -d "$(DPS)/$${i}" ]; then \ if [ -d "$(DPS)/$${i}" ]; then \
cd "$(DPS)/$${i}"; \ cd "$(DPS)/$${i}"; \
git pull; \ git pull; \
cd - ; \ cd - ; \
else \ else \
mkdir -p "$(DPS)/$${i}"; \ mkdir -p "$(DPS)/$${i}"; \
cd "$(DPS)/$${i}"; \ cd "$(DPS)/$${i}"; \
cd .. ; \ cd .. ; \
git clone "https://$${i}"; \ git clone "https://$${i}"; \
cd - ; \ cd - ; \
fi; \ fi; \
done done
build_deps: build_deps:
mkdir -p $(BLD) mkdir -p $(BLD)
cd $(BLD); \ cd $(BLD); \
for i in $(DEPEND); do \ for i in $(DEPEND); do \
if [ -f "$(DPS)/$${i}/GNUmakefile" ]; then \ if [ -f "$(DPS)/$${i}/GNUmakefile" ]; then \
make -f "$(DPS)/$${i}/GNUmakefile" BUILD=$(BLD); \ make -f "$(DPS)/$${i}/GNUmakefile" BUILD=$(BLD); \
else \ else \
make -f "$(DPS)/$${i}/Makefile" BUILD=$(BLD); \ make -f "$(DPS)/$${i}/Makefile" BUILD=$(BLD); \
fi; \ fi; \
done done
buildThis: buildThis:
@ -48,13 +48,10 @@ buildThis:
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkLinuxFiles.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkLinuxFiles.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkTime.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkTime.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkLogger.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkLogger.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkHttp.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkEnv.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkEnv.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkGit.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkGit.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkCharacterStack.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkJsonParser.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkConf.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkStorage.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkStorage.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkConf.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkSyncer.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkSyncer.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkdepTree.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkdepTree.Mod
cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkDot.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkDot.Mod

View file

@ -2,8 +2,8 @@ MODULE vpkEnv;
IMPORT Files, Platform, Strings, Out, vpkSettings, vpkFiles, strTypes; IMPORT Files, Platform, Strings, Out, vpkSettings, vpkFiles, strTypes;
VAR VAR
conf, confDir : ARRAY 256 OF CHAR; conf-, confDir- : ARRAY 256 OF CHAR;
pkgTreeDir: POINTER TO ARRAY OF CHAR; pkgTreeDir-: POINTER TO ARRAY OF CHAR;
PROCEDURE getHome*(VAR path: ARRAY OF CHAR); PROCEDURE getHome*(VAR path: ARRAY OF CHAR);
BEGIN BEGIN
@ -35,7 +35,7 @@ VAR
BEGIN BEGIN
len := 9 + Strings.Length(depName) + Strings.Length(path0); len := 9 + Strings.Length(depName) + Strings.Length(path0);
(* 5 chars are ../, /, /, plus a couple of chars *) (* 5 chars are ../, /, /, plus a couple of chars *)
NEW(p, len); NEW(p, len);
COPY("../", p^); COPY("../", p^);
Strings.Append(vpkSettings.vpkDepDir, p^); Strings.Append(vpkSettings.vpkDepDir, p^);
Strings.Append("/", p^); Strings.Append("/", p^);
@ -58,7 +58,7 @@ VAR
ln : INTEGER; ln : INTEGER;
BEGIN BEGIN
ln := 3 + Strings.Length(prefix) + Strings.Length(vpkSettings.vpkBldDir); ln := 3 + Strings.Length(prefix) + Strings.Length(vpkSettings.vpkBldDir);
NEW(builddir, ln); NEW(builddir, ln);
COPY(prefix, builddir^); COPY(prefix, builddir^);
createIfNotThere(builddir^); createIfNotThere(builddir^);
Strings.Append("/", builddir^); Strings.Append("/", builddir^);
@ -211,7 +211,7 @@ BEGIN
HALT(1); HALT(1);
END; END;
END; END;
END; END;
tmp := confDir; tmp := confDir;
Strings.Append('/', tmp); Strings.Append('/', tmp);
Strings.Append(vpkSettings.vpkTreeDir, tmp); Strings.Append(vpkSettings.vpkTreeDir, tmp);

View file

@ -1,6 +1,6 @@
MODULE vpkConf; MODULE vpkConf;
IMPORT Out, Files, Strings, Platform, IMPORT Out, Files, Strings, Platform,
vpkSettings, vpkEnv, vpkJsonParser; vpkSettings, vpkEnv, Json;
CONST CONST
open = '{"'; open = '{"';
@ -44,7 +44,7 @@ PROCEDURE configured*(): BOOLEAN;
BEGIN BEGIN
RETURN vpkEnv.checkConfig() RETURN vpkEnv.checkConfig()
END configured; END configured;
(*
PROCEDURE getConfigTreeVal*(VAR tree: vpkSettings.tree); PROCEDURE getConfigTreeVal*(VAR tree: vpkSettings.tree);
VAR VAR
f: Files.File; r: Files.Rider; f: Files.File; r: Files.Rider;
@ -78,6 +78,74 @@ BEGIN
tree.typ := vpkSettings.unkn; tree.typ := vpkSettings.unkn;
END; END;
END getConfigTreeVal; END getConfigTreeVal;
*)
PROCEDURE getConfigTreeVal*(VAR tree: vpkSettings.tree);
CONST
defConfSize=512;
VAR
f: Files.File; r: Files.Rider;
jsonstr, errstr: Json.jString;
jsonTree, pathValue, typeValue, branchValue: Json.Value;
rootObj: Json.Obj;
Path, Type, Git, HTTP: Json.jString;
b: BOOLEAN;
i: INTEGER;
BEGIN
COPY("", tree.branch);
COPY("", tree.url);
f := vpkEnv.getConfFile();
Files.Set(r, f, 0);
NEW(jsonstr, defConfSize);
NEW(errstr, 4096); (* Adjust size as needed *)
i := 0;
REPEAT
Files.Read(r, jsonstr^[i]);
INC(i)
UNTIL r.eof OR (i>=LEN(jsonstr^));
Files.Close(f);
b := Json.Parse(jsonTree, jsonstr^, errstr^);
IF b THEN
IF jsonTree IS Json.Obj THEN
rootObj := jsonTree(Json.Obj);
NEW(Path, Strings.Length(vpkSettings.rmtTreeKey)+1);
COPY(vpkSettings.rmtTreeKey, Path^);
IF Json.ObjSelect(pathValue, rootObj, Path) THEN
IF pathValue IS Json.Str THEN
Out.String("aaa");
(*this crashes voc *)
(* tree.url := pathValue(Json.Str).str^;*)
COPY(pathValue(Json.Str).str^, tree.url);
END;
END;
NEW(Type, Strings.Length(vpkSettings.rmtTypKey)+1);
COPY(vpkSettings.rmtTypKey, Type^);
IF Json.ObjSelect(typeValue, rootObj, Type) THEN
IF typeValue IS Json.Str THEN
NEW(Git, Strings.Length(vpkSettings.rmtTypGitVal)+1);
NEW(HTTP, Strings.Length(vpkSettings.rmtTypHttpVal)+1);
IF typeValue(Json.Str).str^ = "git" THEN
tree.typ := vpkSettings.git;
ELSIF typeValue(Json.Str).str^ = "http" THEN
tree.typ := vpkSettings.http;
ELSE
tree.typ := vpkSettings.unkn;
END;
END;
END;
ELSE
Out.String("JSON root is not an object."); Out.Ln;
END;
ELSE
Out.String("JSON parsing failed: "); Out.String(errstr^); Out.Ln;
END;
END getConfigTreeVal;
PROCEDURE setTreeDir*(VAR a: ARRAY OF CHAR); PROCEDURE setTreeDir*(VAR a: ARRAY OF CHAR);
BEGIN BEGIN

View file

@ -1,5 +1,5 @@
MODULE vpkDot; MODULE vpkDot;
IMPORT Strings, vpkdepTree, StringList; IMPORT Out, Strings, vpkdepTree, StringList;
CONST CONST
first = "digraph dependencies {"; first = "digraph dependencies {";
@ -19,11 +19,15 @@ BEGIN
lst.AppendString(lst, line); lst.AppendString(lst, line);
i := 0; i := 0;
REPEAT REPEAT
Out.String("entered repeat"); Out.Ln;
dep := tree.Get(tree, i); dep := tree.Get(tree, i);
IF dep # NIL THEN IF dep # NIL THEN
Out.String("dep # nil"); Out.Ln;
IF dep.deps # NIL THEN IF dep.deps # NIL THEN
Out.String("dep.deps # nil"); Out.Ln;
j := 0; j := 0;
REPEAT REPEAT
Out.String("othe repeat");Out.Ln;
IF dep.deps[j]^.name # NIL THEN IF dep.deps[j]^.name # NIL THEN
COPY("", line); COPY("", line);
Strings.Append(tab, line); Strings.Append(tab, line);
@ -31,9 +35,12 @@ BEGIN
Strings.Append(arrow, line); Strings.Append(arrow, line);
Strings.Append(dep.deps[j]^.name^, line); Strings.Append(dep.deps[j]^.name^, line);
lst.AppendString(lst, line); lst.AppendString(lst, line);
Out.String("appends over"); Out.Ln;
END; END;
INC(j) INC(j);
UNTIL j = (LEN(dep.deps^) -1 ); Out.String("j="); Out.Int(j,0); Out.Ln;
Out.String("len dep.deps"); Out.Int(LEN(dep.deps^), 0); Out.Ln;
UNTIL j = (LEN(dep.deps^));
END END
END; END;
INC(i) INC(i)

View file

@ -14,7 +14,7 @@ BEGIN
tree := vpkResolver.resolve(unit, vpkJsonDepRetriever.getDeps); tree := vpkResolver.resolve(unit, vpkJsonDepRetriever.getDeps);
Out.String(" done! (:"); Out.Ln; Out.Ln; Out.String(" done! (:"); Out.Ln; Out.Ln;
lst := vpkDot.tree2dot(tree); lst := vpkDot.tree2dot(tree);
Out.String("dependency graph:"); Out.Ln; Out.String("dependency graph:"); Out.Ln;
Out.String("-----------------"); Out.Ln; Out.String("-----------------"); Out.Ln;
StringList.DumpOut(lst); StringList.DumpOut(lst);
lst.Dump(lst, graphName); lst.Dump(lst, graphName);
@ -52,7 +52,7 @@ BEGIN
i := 0; i := 0;
REPEAT REPEAT
dep := vpkdepTree.Get(depTree, i); dep := vpkdepTree.Get(depTree, i);
vpkJsonDepRetriever.getURIandType(dep, URI, typ, branch); vpkJsonDepRetriever.getURIandType(dep, URI, typ, branch);
vpkSyncer.fetch(dep.name^, URI, typ, prefix, branch); vpkSyncer.fetch(dep.name^, URI, typ, prefix, branch);
INC(i) INC(i)
UNTIL i = depTree.Count; UNTIL i = depTree.Count;
@ -71,13 +71,13 @@ VAR
builddir, cmd, srcPath: StringList.pstring; builddir, cmd, srcPath: StringList.pstring;
res: INTEGER; res: INTEGER;
BEGIN BEGIN
IF prefix # "" THEN IF prefix # "" THEN
builddir := vpkEnv.mkBldDir(prefix) builddir := vpkEnv.mkBldDir(prefix)
ELSE ELSE
builddir := vpkEnv.mkdefBldDir(); builddir := vpkEnv.mkdefBldDir();
END; END;
depTree := resolve(package); depTree := resolve(package);
IF a THEN ask END; IF a THEN ask END;
i := 0; i := 0;
REPEAT REPEAT
dep := vpkdepTree.Get(depTree, i); dep := vpkdepTree.Get(depTree, i);
@ -100,7 +100,7 @@ BEGIN
res := Platform.System(cmd^); res := Platform.System(cmd^);
IF res # 0 THEN Out.String("failed to run build command"); Out.Ln END; IF res # 0 THEN Out.String("failed to run build command"); Out.Ln END;
INC(j) INC(j)
UNTIL j = keys.Count - 1; UNTIL j = keys.Count;
ELSE ELSE
Out.String("no build info found for the package: "); Out.String(dep.name^); Out.Ln; Out.String("no build info found for the package: "); Out.String(dep.name^); Out.Ln;
END; END;

View file

@ -1,109 +1,228 @@
MODULE vpkJsonDepRetriever; MODULE vpkJsonDepRetriever;
IMPORT Out, StringList, strUtils, vpkJsonParser, vpkStorage, vpkSettings, vpkdepTree; IMPORT Strings, Out,
StringList, strUtils, Json, vpkStorage, vpkSettings, vpkdepTree;
CONST
ErrmessSize = 4096;
PROCEDURE getBuildInfo*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TStringList): BOOLEAN; PROCEDURE getBuildInfo*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TStringList): BOOLEAN;
VAR VAR
p: strUtils.pstring; jsonstr, errstr: strUtils.pstring;
jsonRecord, build : vpkJsonParser.JsonTypePointer; tree, buildValue, command, file: Json.Value;
keys, values: StringList.TStringList; rootObj, buildStep: Json.Obj;
buildArray: Json.Arr;
cm, fl, bl: Json.jString;
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
k := NIL; v := NIL;
b := FALSE; b := FALSE;
p := NIL; jsonstr := NIL;
vpkStorage.json2pstring(d.name^, p); vpkStorage.json2pstring(d.name^, jsonstr);
IF p # NIL THEN IF jsonstr # NIL THEN
jsonRecord := vpkJsonParser.Create(p^); NEW(errstr, ErrmessSize);
build := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.bldType); b := Json.Parse(tree, jsonstr^, errstr^);
IF build # NIL THEN (*build := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.bldType);*)
keys := NIL; values := NIL; IF b THEN
(*keys := NIL; values := NIL;
build.GetTerminalKeys(build, keys); build.GetTerminalKeys(build, keys);
build.GetTerminalValues(build, values); build.GetTerminalValues(build, values);
k := keys; v := values; k := keys; v := values;*)
RETURN TRUE IF tree IS Json.Obj THEN
rootObj := tree(Json.Obj);
NEW(bl, Strings.Length(vpkSettings.bldType)+1); (* +1 for 0X *)
COPY(vpkSettings.bldType, bl^);
IF Json.ObjSelect(buildValue, rootObj, bl) THEN
IF buildValue IS Json.Arr THEN
buildArray := buildValue(Json.Arr);
WHILE buildArray # NIL DO
buildStep := buildArray.value(Json.Obj);
NEW(cm, Strings.Length(vpkSettings.bldCommand)+1); (* +1 for 0X *)
NEW(fl, Strings.Length(vpkSettings.bldFile)+1); (* +1 for 0X *)
COPY(vpkSettings.bldCommand, cm^);
COPY(vpkSettings.bldFile, fl^);
Out.String("cm^ is"); Out.String(cm^); Out.Ln;
Out.String("fl^ is"); Out.String(fl^); Out.Ln;
IF Json.ObjSelect(command, buildStep, cm) &
Json.ObjSelect(file, buildStep, fl) THEN
Out.String("COMMAND FOUND"); Out.Ln;
Out.String("FILE FOUND"); Out.Ln;
IF (command IS Json.Str) & (file IS Json.Str) THEN
Out.String("Command: "); Out.String(command(Json.Str).str^);
Out.String(", File: "); Out.String(file(Json.Str).str^); Out.Ln;
IF k = NIL THEN k := StringList.Create() END;
IF v = NIL THEN v := StringList.Create() END;
k.AppendString(k, command(Json.Str).str^);
v.AppendString(v, file(Json.Str).str^);
ELSE
Out.String("command and file must be strings"); Out.Ln;
HALT(5);
END;
END;
buildArray := buildArray.next;
END;
ELSE
Out.String("Build section is not an array."); Out.Ln;
END;
ELSE
Out.String("Build section not found."); Out.Ln;
END;
ELSE
Out.String("JSON root is not an object."); Out.Ln;
END;
ELSE ELSE
RETURN FALSE Out.String("JSON parsing failed: "); Out.String(errstr^); Out.Ln;
END END;
ELSE
RETURN FALSE
END; END;
RETURN b;
END getBuildInfo; END getBuildInfo;
PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep; VAR URI: ARRAY OF CHAR; VAR type: ARRAY OF CHAR; VAR branch: ARRAY OF CHAR); PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep; VAR URI: ARRAY OF CHAR; VAR type: ARRAY OF CHAR; VAR branch: ARRAY OF CHAR);
VAR VAR
jsonRecord, remote: vpkJsonParser.JsonTypePointer; jsonstr, errstr: strUtils.pstring;
p: strUtils.pstring; tree, singleValue, remoteValue, uriValue, typeValue, branchValue: Json.Value;
k, v: StringList.pstring; rootObj, someObj, remoteObj: Json.Obj;
keys, values: StringList.TStringList; err: ARRAY ErrmessSize OF CHAR;
i: LONGINT; b, fndRemSec: BOOLEAN;
key, val, u, t, br, remote: Json.jString;
BEGIN BEGIN
Out.String("ENTERED GET URI AND TYPE"); Out.Ln;
strUtils.zeroStr(URI); strUtils.zeroStr(URI);
strUtils.zeroStr(type); strUtils.zeroStr(type);
strUtils.zeroStr(branch); strUtils.zeroStr(branch);
p := NIL; jsonstr := NIL;
vpkStorage.json2pstring(d.name^, p); vpkStorage.json2pstring(d.name^, jsonstr);
IF p # NIL THEN IF jsonstr # NIL THEN
jsonRecord := vpkJsonParser.Create(p^); Out.String("JSONSTR # NIL"); Out.Ln;
remote := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.rmtType); NEW(errstr, ErrmessSize);
IF remote # NIL THEN b := Json.Parse(tree, jsonstr^, err);
keys := NIL; values := NIL;
remote.GetTerminalKeys(remote, keys);
remote.GetTerminalValues(remote, values);
i := 0;
REPEAT
k := keys.GetString(keys, i);
v := values.GetString(values, i);
IF k^ = vpkSettings.rmtTypKey THEN COPY(v^, type) END;
IF k^ = vpkSettings.rmtTreeKey THEN COPY(v^, URI) END;
IF k^ = vpkSettings.rmtTreeBranchKey THEN COPY(v^, branch) 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
jsonRecord, dependencies: vpkJsonParser.JsonTypePointer;
p: strUtils.pstring;
b: BOOLEAN;
pkgName : ARRAY 32 OF CHAR;
BEGIN
depstrlist := NIL;
p := NIL;
vpkStorage.json2pstring(d.name^, p);
IF p # NIL THEN
jsonRecord := vpkJsonParser.Create(p^);
b := jsonRecord.GetTerminal(jsonRecord, vpkSettings.pkgTypKey, pkgName);
IF b THEN IF b THEN
dependencies := NIL; Out.String("b IS TRUE"); Out.Ln;
Out.String("searching dependencies for '"); Out.String(d.name^); Out.String("'... "); IF tree IS Json.Obj THEN
dependencies := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.depTypKey); Out.String("tree IS Json.Obj"); Out.Ln;
IF dependencies # NIL THEN rootObj := tree(Json.Obj);
Out.String("found!"); Out.Ln; NEW(u, Strings.Length(vpkSettings.rmtTreeKey) + 1); COPY(vpkSettings.rmtTreeKey, u^);
dependencies.GetTerminalKeys(dependencies, depstrlist); NEW(t, Strings.Length(vpkSettings.rmtTypKey) + 1); COPY(vpkSettings.rmtTypKey, t^);
StringList.list(depstrlist); NEW(br, Strings.Length(vpkSettings.rmtTreeBranchKey) + 1); COPY(vpkSettings.rmtTreeBranchKey, br^);
RETURN depstrlist.Count NEW(remote, Strings.Length(vpkSettings.rmtType)+1);
COPY(vpkSettings.rmtType, remote^);
fndRemSec := FALSE;
REPEAT
IF rootObj.name^ = remote^ THEN
fndRemSec := TRUE;
Out.String("REMOTE SECT FOUND"); Out.Ln;
END;
IF ~fndRemSec THEN rootObj := rootObj.next END
UNTIL (rootObj = NIL) OR fndRemSec;
Out.String("exited the loop");
IF fndRemSec THEN
WHILE rootObj # NIL DO
Out.String("entered while rootobj # nil"); Out.Ln;
Out.String("rootobj.name "); Out.String(rootObj.name^); Out.Ln;
remoteValue := rootObj.value;
IF remoteValue IS Json.Obj THEN
Out.String(" remotevalue is jsonobj"); Out.Ln;
singleValue := remoteValue(Json.Obj);
WHILE singleValue # NIL DO
IF singleValue IS Json.Obj THEN
Out.String("singlevalue is jsonobj"); Out.Ln;
someObj := singleValue(Json.Obj);
key := someObj.name;
Out.String("key is "); Out.String(key^); Out.Ln;
val := someObj.value(Json.Str).str;
Out.String("val is "); Out.String(val^); Out.Ln;
Out.Ln;
IF key^ = vpkSettings.rmtTypKey THEN COPY(val^, type) END;
IF key^ = vpkSettings.rmtTreeBranchKey THEN COPY(val^, branch) END;
IF key^ = vpkSettings.rmtTreeKey THEN COPY(val^, URI) END;
END; (* if singlevalue is json.obj *)
singleValue := someObj.next;
END (* while singlevalue # nil *)
END; (* if remotevalue is json.obj *)
rootObj := rootObj.next
END; (* while rootObj # NIL *)
ELSE
Out.String("Remote section not found."); Out.Ln;
END;
ELSE ELSE
Out.String("...has no dependencies"); Out.Ln; Out.String("JSON root is not an object."); Out.Ln;
RETURN 0 END;
END
ELSE ELSE
RETURN -2 (* json doesn't contain 'Package' key, malformed *) Out.String("JSON parsing failed: "); Out.String(err); Out.Ln;
END; END;
ELSE ELSE
RETURN -1 (* no such json file found *) Out.String("No JSON string provided."); Out.Ln;
END; END;
END getURIandType;
PROCEDURE getDeps*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT;
VAR
jsonstr, errstr: strUtils.pstring;
tree, depsValue, singleDep: Json.Value;
rootObj, depObj: Json.Obj;
depName, depVersion: Json.jString;
foundDepSection: BOOLEAN;
BEGIN
depstrlist := NIL;
jsonstr := NIL;
vpkStorage.json2pstring(d.name^, jsonstr);
IF jsonstr # NIL THEN
NEW(errstr, ErrmessSize);
IF Json.Parse(tree, jsonstr^, errstr^) THEN
IF tree IS Json.Obj THEN
rootObj := tree(Json.Obj); Out.String("entering first while"); Out.Ln;
(* searching for dependencies section *)
foundDepSection := FALSE;
REPEAT
IF rootObj.name^ = "Dependencies" THEN
foundDepSection := TRUE;
Out.String("dependency section found"); Out.Ln;
END;
IF ~foundDepSection THEN rootObj := rootObj.next END
UNTIL (rootObj = NIL) OR foundDepSection;
Out.String("exited the loop"); Out.Ln;
IF foundDepSection THEN
WHILE rootObj # NIL DO
Out.String("entered"); Out.Ln;
Out.String("rootobj.name "); Out.String(rootObj.name^); Out.Ln;
(*IF rootObj.name^ = "Dependencies" THEN Out.String("yes name deps");Out.Ln;*)
depsValue := rootObj.value;
IF depsValue IS Json.Obj THEN Out.String("depsvalue is jsonobj"); Out.Ln;
singleDep := depsValue(Json.Obj);
WHILE singleDep # NIL DO
IF singleDep IS Json.Obj THEN Out.String("singledep is json obj"); Out.Ln;
depObj := singleDep(Json.Obj);
depName := depObj.name;
Out.String("name "); Out.String(depName^); Out.Ln;
Out.String("assigning depVersion"); Out.Ln;
depVersion := depObj.value(Json.Str).str;
Out.String("version "); Out.String(depVersion^); Out.Ln;
Out.String("assigning depstrlist"); Out.Ln;
IF depstrlist = NIL THEN depstrlist := StringList.Create() END;
depstrlist.AppendString(depstrlist, depName^);
Out.String("lets find next"); Out.Ln;
singleDep := depObj.next; (* Move to the next dependency *)
END;
END; (* End of inner WHILE loop for dependencies *)
Out.String("returning "); Out.Int(depstrlist.Count, 0); Out.Ln;
RETURN depstrlist.Count;
END; (* End of IF depsValue IS Json.Obj *)
(*END;*) (* End of IF rootObj.name^ = "Dependencies" *)
rootObj := rootObj.next; (* Move to the next JSON object *)
END; (* End of WHILE rootObj # NIL loop *)
ELSE
Out.String("returnig 0"); Out.Ln;
RETURN 0; (* found no dependencies *)
END;
END; (* End of IF tree IS Json.Obj *)
ELSE
Out.String("JSON parsing failed: "); Out.String(errstr^); Out.Ln;
END; (* End of IF Json.Parse *)
ELSE
Out.String("dependency '"); Out.String(d.name^); Out.String("' not found."); Out.Ln;
RETURN -1; (* No such JSON file found *)
END; (* End of IF jsonstr # NIL *)
RETURN 0;
END getDeps; END getDeps;
END vpkJsonDepRetriever. END vpkJsonDepRetriever.

View file

@ -58,7 +58,9 @@ VAR
i: INTEGER; i: INTEGER;
rtrvRes: LONGINT; rtrvRes: LONGINT;
BEGIN BEGIN
Out.String("entered mkDepTree, d.name^ is "); Out.String(d.name^); Out.Ln;
vpkdepTree.Add(met, d); vpkdepTree.Add(met, d);
Out.String("EXITED vpkdepTree.Add"); Out.Ln;
IF d.RetrieveDeps = NIL THEN Out.String("dep retriever method not installed"); Out.Ln; HALT(1) END; IF d.RetrieveDeps = NIL THEN Out.String("dep retriever method not installed"); Out.Ln; HALT(1) END;
rtrvRes := d.RetrieveDeps(d, depStrs); rtrvRes := d.RetrieveDeps(d, depStrs);
IF rtrvRes = -1 THEN IF rtrvRes = -1 THEN
@ -68,36 +70,48 @@ BEGIN
Out.Ln; Out.String(d.name^); Out.String(".json malformed: no 'Package' section."); Out.Ln; Out.Ln; Out.String(d.name^); Out.String(".json malformed: no 'Package' section."); Out.Ln;
HALT(62); HALT(62);
END; END;
Out.String("checking if depStrs in NIL"); Out.Ln;
IF depStrs # NIL THEN IF depStrs # NIL THEN
(*IF rtrvRes > 0 THEN*)
Out.String("no, continueing"); Out.Ln;
NEW (deps, depStrs.Count); NEW (deps, depStrs.Count);
i := 0; i := 0;
REPEAT REPEAT
p := depStrs.GetString(depStrs, i); p := depStrs.GetString(depStrs, i);
IF p # NIL THEN IF p # NIL THEN
Out.String("p#nil"); Out.Ln;
t := NIL; t := NIL;
t := met.GetByName(met, p^); t := met.GetByName(met, p^);
IF t = NIL THEN IF t = NIL THEN
Out.String("t#nil"); Out.Ln;
t := vpkdepTree.CreateDep(p^); t := vpkdepTree.CreateDep(p^);
t.InstallRetriever(t, rtvr); t.InstallRetriever(t, rtvr);
END; END;
IF t = NIL THEN Out.String("t=nil"); Out.Ln END;
deps[i] := t; deps[i] := t;
Out.String("assigned t to deps[i]"); Out.Ln;
IF ~treeContainsByName(t, depTree) THEN IF ~treeContainsByName(t, depTree) THEN
Out.String("not tree contains by name is true "); Out.Ln;
IF treeContainsByName(t, met) THEN IF treeContainsByName(t, met) THEN
Out.Ln; Out.String("curcular dependency: "); Out.Ln; Out.String("curcular dependency: ");
Out.String(d.name^); Out.String(" requires "); Out.String(t.name^); Out.Ln; Out.String(d.name^); Out.String(" requires "); Out.String(t.name^); Out.Ln;
Out.String("unable to continue."); Out.Ln; Out.String("unable to continue."); Out.Ln;
HALT(60) HALT(60)
ELSE ELSE
Out.String("entering mkdeptree recursively"); Out.Ln;
mkDepTree(t, depTree, met); mkDepTree(t, depTree, met);
Out.String("exited mkdeptryy recursively"); Out.Ln;
END; END;
END; END;
END; END;
INC(i); INC(i); Out.String("i="); Out.Int(i, 0); Out.Ln;
UNTIL i = depStrs.Count - 1; Out.String("depstrscount="); Out.Int(depStrs.Count, 0); Out.Ln;
UNTIL i = depStrs.Count;
d.AssignDeps(d, deps); d.AssignDeps(d, deps);
END; END;
Out.String("addcopy"); Out.Ln;
vpkdepTree.AddCopy(depTree, d); vpkdepTree.AddCopy(depTree, d);
Out.String("exited addcopy"); Out.Ln;
END mkDepTree; END mkDepTree;
PROCEDURE resolve*(first: ARRAY OF CHAR; r: vpkdepTree.retriever): TdepTree; PROCEDURE resolve*(first: ARRAY OF CHAR; r: vpkdepTree.retriever): TdepTree;
@ -106,12 +120,14 @@ VAR
met: TdepTree; met: TdepTree;
dep: Tdep; dep: Tdep;
BEGIN BEGIN
Out.String("first : "); Out.String(first); Out.Ln;
rtvr := r; rtvr := r;
depTree := vpkdepTree.Create(); depTree := vpkdepTree.Create();
met := vpkdepTree.Create(); (* for deps that we already met *) met := vpkdepTree.Create(); (* for deps that we already met *)
dep := vpkdepTree.CreateDep(first); dep := vpkdepTree.CreateDep(first);
dep.InstallRetriever(dep, rtvr); dep.InstallRetriever(dep, rtvr);
mkDepTree(dep, depTree, met); mkDepTree(dep, depTree, met);
Out.String("exiting resolve()"); Out.Ln;
RETURN depTree RETURN depTree
END resolve; END resolve;

View file

@ -1,41 +1,22 @@
MODULE vpkSettings; MODULE vpkSettings;
IMPORT Platform, Out; IMPORT Platform, Out;
CONST CONST
vpkConfDir* = ".vipack";
vpkConfFile* = "vipackConf.json";
vpkTreeDir* = "vipackTree";
vpkPkgDir* = "vpkLocal";
vpkDepDir* = "deps";
vpkBldDir* = "build";
graphName* = "deps.dot";
rmtType* = "Remote";
rmtTypKey* = "type";
rmtTypGitVal* = "git";
rmtTypHttpVal* = "http";
rmtTypHttpsVal* = "https";
rmtTypGemiVal* = "gemini";
rmtTreeKey* = "path";
rmtTreeBranchKey* = "branch";
bldType* = "Build";
defTreeVal* = "https://github.com/vishaps/vipackTree";
(*defTreeVal* = "git@github.com:vishaps/vipackTree";*)
confTreeVal* = defTreeVal;
defTypVal* = rmtTypGitVal;
pkgTypKey* = "Package";
depTypKey* = "Dependencies";
packageFileName* = "VersionFile.json";
host* = "localhost";
port* = "80";
http* = 0; http* = 0;
https* = 1; https* = 1;
gemini* = 2; gemini* = 2;
git* = 3; git* = 3;
unkn* = -1; unkn* = -1;
VAR
vpkConfDir-, vpkConfFile-, vpkTreeDir-, vpkPkgDir-, vpkDepDir-, vpkBldDir-,
graphName-,
rmtType-, rmtTypKey-, rmtTypGitVal-, rmtTypHttpVal-, rmtTypHttpsVal-,
rmtTypGemiVal-, rmtTreeKey-, rmtTreeBranchKey-,
bldType-, bldCommand-, bldFile-,
defTreeVal-, confTreeVal-,
defTypVal-, pkgTypKey-, depTypKey-, packageFileName-,
host-, port-: ARRAY 128 OF CHAR;
TYPE TYPE
tree* = RECORD tree* = RECORD
url* : ARRAY 128 OF CHAR; url* : ARRAY 128 OF CHAR;
@ -43,6 +24,37 @@ TYPE
branch*: ARRAY 128 OF CHAR; branch*: ARRAY 128 OF CHAR;
END; END;
BEGIN
vpkConfDir := ".vipack";
vpkConfFile := "vipackConf.json";
vpkTreeDir := "vipackTree";
vpkPkgDir := "vpkLocal";
vpkDepDir := "deps";
vpkBldDir := "build";
graphName := "deps.dot";
rmtType := "Remote";
rmtTypKey := "type";
rmtTypGitVal := "git";
rmtTypHttpVal := "http";
rmtTypHttpsVal := "https";
rmtTypGemiVal := "gemini";
rmtTreeKey := "path";
rmtTreeBranchKey := "branch";
bldType := "Build";
bldCommand := "command";
bldFile := "file";
defTreeVal := "https://github.com/vishaps/vipackTree";
(*defTreeVal := "git@github.com:vishaps/vipackTree";*)
confTreeVal := defTreeVal;
defTypVal := rmtTypGitVal;
pkgTypKey := "Package";
depTypKey := "Dependencies";
packageFileName := "VersionFile.json";
host := "localhost";
port := "80";
END vpkSettings. END vpkSettings.

View file

@ -7,17 +7,17 @@ BEGIN
Files.WriteBytes(r, str, Strings.Length(str)); Files.WriteBytes(r, str, Strings.Length(str));
END WriteString; END WriteString;
PROCEDURE fileToString*(VAR fileName: ARRAY OF CHAR; VAR returnString: strUtils.pstring); PROCEDURE fileToString*(fileName: ARRAY OF CHAR; VAR returnString: strUtils.pstring);
VAR VAR
f: Files.File; f: Files.File;
r: Files.Rider; r: Files.Rider;
i, j: LONGINT; i, j: LONGINT;
BEGIN BEGIN
returnString := NIL; returnString := NIL;
f := Files.Old(fileName); f := Files.Old(fileName);
IF f # NIL THEN IF f # NIL THEN
Files.Set(r, f, 0); Files.Set(r, f, 0);
i := Files.Length(f); i := Files.Length(f);
NEW(returnString, i); NEW(returnString, i);
j := 0; j := 0;
REPEAT REPEAT
@ -41,7 +41,7 @@ VAR
BEGIN BEGIN
f := Files.New(fileName); f := Files.New(fileName);
IF f = NIL THEN IF f = NIL THEN
vpkLogger.Log(fileName); vpkLogger.Log(fileName);
vpkLogger.Log(" not found"); vpkLogger.Log(" not found");
vpkLogger.Ln; vpkLogger.Ln;
@ -67,7 +67,7 @@ BEGIN
vpkEnv.getTreeDir(fi.name); vpkEnv.getTreeDir(fi.name);
Strings.Append("/", fi.name); Strings.Append("/", fi.name);
Strings.Append(json, fi.name); Strings.Append(json, fi.name);
Strings.Append(".json", fi.name); Strings.Append(".json", fi.name);
IF vpkFiles.Exists(fi) THEN IF vpkFiles.Exists(fi) THEN
fileToString(fi.name, pstr); fileToString(fi.name, pstr);
END END