From bf32bf4a8f0fb332973ff077cfd3b1a5b73cf2e5 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Wed, 31 Jan 2024 07:57:23 +0400 Subject: [PATCH] refactoring to use sts-q's json module. compiles. --- GNUmakefile | 39 ++++--- src/unix/vpkEnv.Mod | 10 +- src/vpkConf.Mod | 72 ++++++++++++- src/vpkJsonDepRetriever.Mod | 196 ++++++++++++++++++++++++++++++++---- src/vpkSettings.Mod | 74 ++++++++------ src/vpkStorage.Mod | 12 +-- 6 files changed, 316 insertions(+), 87 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 20967a2..885600f 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -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 mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) @@ -19,28 +19,28 @@ all: get_deps build_deps buildThis get_deps: @for i in $(DEPEND); do \ - if [ -d "$(DPS)/$${i}" ]; then \ - cd "$(DPS)/$${i}"; \ - git pull; \ - cd - ; \ - else \ - mkdir -p "$(DPS)/$${i}"; \ - cd "$(DPS)/$${i}"; \ - cd .. ; \ - git clone "https://$${i}"; \ - cd - ; \ - fi; \ + if [ -d "$(DPS)/$${i}" ]; then \ + cd "$(DPS)/$${i}"; \ + git pull; \ + cd - ; \ + else \ + mkdir -p "$(DPS)/$${i}"; \ + cd "$(DPS)/$${i}"; \ + cd .. ; \ + git clone "https://$${i}"; \ + cd - ; \ + fi; \ done build_deps: mkdir -p $(BLD) cd $(BLD); \ for i in $(DEPEND); do \ - if [ -f "$(DPS)/$${i}/GNUmakefile" ]; then \ - make -f "$(DPS)/$${i}/GNUmakefile" BUILD=$(BLD); \ - else \ - make -f "$(DPS)/$${i}/Makefile" BUILD=$(BLD); \ - fi; \ + if [ -f "$(DPS)/$${i}/GNUmakefile" ]; then \ + make -f "$(DPS)/$${i}/GNUmakefile" BUILD=$(BLD); \ + else \ + make -f "$(DPS)/$${i}/Makefile" BUILD=$(BLD); \ + fi; \ done 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/vpkTime.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/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/vpkConf.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/vpkDot.Mod diff --git a/src/unix/vpkEnv.Mod b/src/unix/vpkEnv.Mod index afb871a..6d13b29 100644 --- a/src/unix/vpkEnv.Mod +++ b/src/unix/vpkEnv.Mod @@ -2,8 +2,8 @@ MODULE vpkEnv; IMPORT Files, Platform, Strings, Out, vpkSettings, vpkFiles, strTypes; VAR - conf, confDir : ARRAY 256 OF CHAR; - pkgTreeDir: POINTER TO ARRAY OF CHAR; + conf-, confDir- : ARRAY 256 OF CHAR; + pkgTreeDir-: POINTER TO ARRAY OF CHAR; PROCEDURE getHome*(VAR path: ARRAY OF CHAR); BEGIN @@ -35,7 +35,7 @@ VAR BEGIN len := 9 + Strings.Length(depName) + Strings.Length(path0); (* 5 chars are ../, /, /, plus a couple of chars *) - NEW(p, len); + NEW(p, len); COPY("../", p^); Strings.Append(vpkSettings.vpkDepDir, p^); Strings.Append("/", p^); @@ -58,7 +58,7 @@ VAR ln : INTEGER; BEGIN ln := 3 + Strings.Length(prefix) + Strings.Length(vpkSettings.vpkBldDir); - NEW(builddir, ln); + NEW(builddir, ln); COPY(prefix, builddir^); createIfNotThere(builddir^); Strings.Append("/", builddir^); @@ -211,7 +211,7 @@ BEGIN HALT(1); END; END; - END; + END; tmp := confDir; Strings.Append('/', tmp); Strings.Append(vpkSettings.vpkTreeDir, tmp); diff --git a/src/vpkConf.Mod b/src/vpkConf.Mod index 88b10c3..946e9e5 100644 --- a/src/vpkConf.Mod +++ b/src/vpkConf.Mod @@ -1,6 +1,6 @@ MODULE vpkConf; IMPORT Out, Files, Strings, Platform, - vpkSettings, vpkEnv, vpkJsonParser; + vpkSettings, vpkEnv, Json; CONST open = '{"'; @@ -44,7 +44,7 @@ PROCEDURE configured*(): BOOLEAN; BEGIN RETURN vpkEnv.checkConfig() END configured; - +(* PROCEDURE getConfigTreeVal*(VAR tree: vpkSettings.tree); VAR f: Files.File; r: Files.Rider; @@ -78,6 +78,74 @@ BEGIN tree.typ := vpkSettings.unkn; END; 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); BEGIN diff --git a/src/vpkJsonDepRetriever.Mod b/src/vpkJsonDepRetriever.Mod index fa543b0..88cd368 100644 --- a/src/vpkJsonDepRetriever.Mod +++ b/src/vpkJsonDepRetriever.Mod @@ -1,33 +1,75 @@ 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; VAR - p: strUtils.pstring; - jsonRecord, build : vpkJsonParser.JsonTypePointer; - keys, values: StringList.TStringList; + jsonstr, errstr: strUtils.pstring; + tree, buildValue, command, file: Json.Value; + rootObj, buildStep: Json.Obj; + buildArray: Json.Arr; + cm, fl, bl: Json.jString; b: BOOLEAN; BEGIN b := FALSE; - p := NIL; - vpkStorage.json2pstring(d.name^, p); - IF p # NIL THEN - jsonRecord := vpkJsonParser.Create(p^); - build := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.bldType); - IF build # NIL THEN - keys := NIL; values := NIL; + jsonstr := NIL; + vpkStorage.json2pstring(d.name^, jsonstr); + IF jsonstr # NIL THEN + NEW(errstr, ErrmessSize); + b := Json.Parse(tree, jsonstr^, errstr^); + (*build := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.bldType);*) + IF b THEN + (*keys := NIL; values := NIL; build.GetTerminalKeys(build, keys); build.GetTerminalValues(build, values); - k := keys; v := values; - RETURN TRUE + k := keys; v := values;*) + 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 + 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^); + 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 - RETURN FALSE - END - ELSE - RETURN FALSE + Out.String("JSON parsing failed: "); Out.String(errstr^); Out.Ln; + END; END; + RETURN b; END getBuildInfo; - +(* PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep; VAR URI: ARRAY OF CHAR; VAR type: ARRAY OF CHAR; VAR branch: ARRAY OF CHAR); VAR jsonRecord, remote: vpkJsonParser.JsonTypePointer; @@ -52,9 +94,9 @@ BEGIN 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; + 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 @@ -67,7 +109,69 @@ BEGIN HALT(64); END END getURIandType; +*) +PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep; VAR URI: ARRAY OF CHAR; VAR type: ARRAY OF CHAR; VAR branch: ARRAY OF CHAR); +VAR + jsonstr, errstr: strUtils.pstring; + tree, remoteValue, uriValue, typeValue, branchValue: Json.Value; + rootObj, remoteObj: Json.Obj; + err: ARRAY ErrmessSize OF CHAR; + b: BOOLEAN; + u, t, br, remote: Json.jString; +BEGIN + strUtils.zeroStr(URI); + strUtils.zeroStr(type); + strUtils.zeroStr(branch); + jsonstr := NIL; + vpkStorage.json2pstring(d.name^, jsonstr); + IF jsonstr # NIL THEN + NEW(errstr, ErrmessSize); + b := Json.Parse(tree, jsonstr^, err); + IF b THEN + IF tree IS Json.Obj THEN + rootObj := tree(Json.Obj); + NEW(u, Strings.Length(vpkSettings.rmtTreeKey) + 1); COPY(vpkSettings.rmtTreeKey, u^); + NEW(t, Strings.Length(vpkSettings.rmtTypKey) + 1); COPY(vpkSettings.rmtTypKey, t^); + NEW(br, Strings.Length(vpkSettings.rmtTreeBranchKey) + 1); COPY(vpkSettings.rmtTreeBranchKey, br^); + NEW(remote, Strings.Length(vpkSettings.rmtType)+1); + COPY(vpkSettings.rmtType, remote^); + IF Json.ObjSelect(remoteValue, rootObj, remote) THEN + IF remoteValue IS Json.Obj THEN + remoteObj := remoteValue(Json.Obj); + IF Json.ObjSelect(uriValue, remoteObj, u) THEN + IF uriValue IS Json.Str THEN + COPY(uriValue(Json.Str).str^, URI); + END; + END; + IF Json.ObjSelect(typeValue, remoteObj, t) THEN + IF typeValue IS Json.Str THEN + COPY(typeValue(Json.Str).str^, type); + END; + END; + IF Json.ObjSelect(branchValue, remoteObj, br) THEN + IF branchValue IS Json.Str THEN + COPY(branchValue(Json.Str).str^, branch); + END; + END; + ELSE + Out.String("Remote section is not an object."); Out.Ln; + END; + ELSE + Out.String("Remote section not found."); Out.Ln; + END; + ELSE + Out.String("JSON root is not an object."); Out.Ln; + END; + ELSE + Out.String("JSON parsing failed: "); Out.String(err); Out.Ln; + END; + ELSE + Out.String("No JSON string provided."); Out.Ln; + 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 @@ -84,7 +188,7 @@ BEGIN b := jsonRecord.GetTerminal(jsonRecord, vpkSettings.pkgTypKey, pkgName); IF b THEN dependencies := NIL; - Out.String("searching dependencies for '"); Out.String(d.name^); Out.String("'... "); + Out.String("searching dependencies for '"); Out.String(d.name^); Out.String("'... "); dependencies := jsonRecord.GetNonTerminal(jsonRecord, vpkSettings.depTypKey); IF dependencies # NIL THEN Out.String("found!"); Out.Ln; @@ -102,6 +206,54 @@ BEGIN RETURN -1 (* no such json file found *) END; END getDeps; +*) + +PROCEDURE getDeps*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT; +VAR + jsonstr, errstr: strUtils.pstring; + tree, depsValue, dep: Json.Value; + rootObj: Json.Obj; + depName: Json.jString; + b: BOOLEAN; +BEGIN + depstrlist := NIL; + jsonstr := NIL; + vpkStorage.json2pstring(d.name^, jsonstr); + IF jsonstr # NIL THEN + NEW(errstr, ErrmessSize); + b := Json.Parse(tree, jsonstr^, errstr^); + IF b THEN + IF tree IS Json.Obj THEN + rootObj := tree(Json.Obj); + NEW(depName, Strings.Length(vpkSettings.depTypKey) + 1); + COPY(vpkSettings.depTypKey, depName^); + IF Json.ObjSelect(depsValue, rootObj, depName) THEN + IF depsValue IS Json.Obj THEN + dep := depsValue(Json.Obj).value; + WHILE dep # NIL DO + IF dep IS Json.Obj THEN + depstrlist.AppendString(depstrlist, dep(Json.Obj).name^); + END; + dep := dep(Json.Obj).next; + END; + RETURN depstrlist.Count; + ELSE + Out.String("Dependencies section is not an object."); Out.Ln; + END; + ELSE + Out.String("Dependencies section not found."); Out.Ln; + 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; + ELSE + RETURN -1; (* no such json file found *) + END; + RETURN 0; +END getDeps; diff --git a/src/vpkSettings.Mod b/src/vpkSettings.Mod index 335e439..31ce943 100644 --- a/src/vpkSettings.Mod +++ b/src/vpkSettings.Mod @@ -1,41 +1,22 @@ MODULE vpkSettings; IMPORT Platform, Out; 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; https* = 1; gemini* = 2; 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 tree* = RECORD url* : ARRAY 128 OF CHAR; @@ -43,6 +24,37 @@ TYPE branch*: ARRAY 128 OF CHAR; 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. diff --git a/src/vpkStorage.Mod b/src/vpkStorage.Mod index f7abb87..697788e 100644 --- a/src/vpkStorage.Mod +++ b/src/vpkStorage.Mod @@ -7,17 +7,17 @@ BEGIN Files.WriteBytes(r, str, Strings.Length(str)); END WriteString; -PROCEDURE fileToString*(VAR fileName: ARRAY OF CHAR; VAR returnString: strUtils.pstring); +PROCEDURE fileToString*(fileName: ARRAY OF CHAR; VAR returnString: strUtils.pstring); VAR f: Files.File; r: Files.Rider; - i, j: LONGINT; + i, j: LONGINT; BEGIN returnString := NIL; f := Files.Old(fileName); - IF f # NIL THEN + IF f # NIL THEN Files.Set(r, f, 0); - i := Files.Length(f); + i := Files.Length(f); NEW(returnString, i); j := 0; REPEAT @@ -41,7 +41,7 @@ VAR BEGIN f := Files.New(fileName); - IF f = NIL THEN + IF f = NIL THEN vpkLogger.Log(fileName); vpkLogger.Log(" not found"); vpkLogger.Ln; @@ -67,7 +67,7 @@ BEGIN vpkEnv.getTreeDir(fi.name); Strings.Append("/", fi.name); Strings.Append(json, fi.name); - Strings.Append(".json", fi.name); + Strings.Append(".json", fi.name); IF vpkFiles.Exists(fi) THEN fileToString(fi.name, pstr); END