now works with new vipatsar with json files in subdirs. also version is

taken from json file name, not from json field.
This commit is contained in:
Norayr Chilingarian 2026-04-06 18:21:36 +04:00
parent 2e048857ee
commit b99aed83c7
6 changed files with 592 additions and 230 deletions

View file

@ -1,5 +1,5 @@
MODULE vpkInstaller; MODULE vpkInstaller;
IMPORT In, Out, Platform, IMPORT In, Out, Platform, Strings,
List, StringList, List, StringList,
vpkResolver, vpkdepTree, vpkDot, vpkEnv, vpkJsonDepRetriever,vpkSyncer, vpkResolver, vpkdepTree, vpkDot, vpkEnv, vpkJsonDepRetriever,vpkSyncer,
vpkTools, vpkSettings; vpkTools, vpkSettings;
@ -76,9 +76,9 @@ VAR
keys, values: StringList.TStringList; keys, values: StringList.TStringList;
k, v: StringList.pstring; k, v: StringList.pstring;
b: BOOLEAN; b: BOOLEAN;
builddir, cmd, srcPath: StringList.pstring; builddir, cmd, srcPath, fullCmd: StringList.pstring;
res: INTEGER; res: INTEGER;
repoPath: ARRAY 256 OF CHAR; (* Changed from domain to repoPath *) repoPath: ARRAY 256 OF CHAR;
node: List.Node; node: List.Node;
BEGIN BEGIN
IF prefix # "" THEN IF prefix # "" THEN
@ -136,11 +136,12 @@ BEGIN
cmd := vpkEnv.mkCmd(k^, srcPath^); cmd := vpkEnv.mkCmd(k^, srcPath^);
Out.String("Command: "); Out.String(cmd^); Out.Ln; Out.String("Command: "); Out.String(cmd^); Out.Ln;
Out.String("Building in "); Out.String(builddir^); Out.Ln; Out.String("Building in "); Out.String(builddir^); Out.Ln;
res := Platform.Chdir(builddir^); NEW(fullCmd, Strings.Length(builddir^) + Strings.Length(cmd^) + 8);
IF res # 0 THEN COPY("cd ", fullCmd^);
Out.String("Failed to change directory to "); Out.String(builddir^); Out.Ln; Out.String("This should never happen."); Out.Ln; HALT(66); Strings.Append(builddir^, fullCmd^);
END; Strings.Append(" && ", fullCmd^);
res := Platform.System(cmd^); Strings.Append(cmd^, fullCmd^);
res := Platform.System(fullCmd^);
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; UNTIL j = keys.Count;

View file

@ -25,57 +25,61 @@ PROCEDURE getBuildInfo*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TStringList
VAR VAR
jsonstr, errstr: strUtils.pstring; jsonstr, errstr: strUtils.pstring;
tree, buildValue, command, file: Json.Value; tree, buildValue, command, file: Json.Value;
rootObj, buildStep: Json.Obj; rootObj, buildStep, rootObjTmp, buildStepTmp: Json.Obj;
buildArray: Json.Arr; buildArray: Json.Arr;
cm, fl, bl, cmLower, flLower: Json.jString; cm, fl, bl, cmLower, flLower, blLower: Json.jString;
b: BOOLEAN;
BEGIN BEGIN
k := NIL; v := NIL; k := NIL; v := NIL;
b := FALSE;
jsonstr := NIL; jsonstr := NIL;
vpkStorage.json2pstring(d.name^, jsonstr); vpkStorage.json2pstring(d.name^, d.version, jsonstr);
IF jsonstr # NIL THEN IF jsonstr # NIL THEN
NEW(errstr, ErrmessSize); NEW(errstr, ErrmessSize);
b := Json.Parse(tree, jsonstr^, errstr^); IF Json.Parse(tree, jsonstr^, errstr^) THEN
IF b THEN
IF tree IS Json.Obj THEN IF tree IS Json.Obj THEN
rootObj := tree(Json.Obj); rootObj := tree(Json.Obj);
NEW(bl, Strings.Length(vpkSettings.bldType) + 1); (* +1 for 0X *) NEW(bl, Strings.Length(vpkSettings.bldType) + 1);
NEW(blLower, Strings.Length(vpkSettings.bldType) + 1);
COPY(vpkSettings.bldType, bl^); COPY(vpkSettings.bldType, bl^);
IF Json.ObjSelect(buildValue, rootObj, bl) THEN COPY(vpkSettings.bldType, blLower^);
ToLower(blLower^);
rootObjTmp := rootObj;
IF ~Json.ObjSelect(buildValue, rootObjTmp, bl) THEN
rootObjTmp := rootObj;
IF ~Json.ObjSelect(buildValue, rootObjTmp, blLower) THEN
Out.String("Build section not found."); Out.Ln;
RETURN FALSE
END;
END;
IF buildValue IS Json.Arr THEN IF buildValue IS Json.Arr THEN
buildArray := buildValue(Json.Arr); buildArray := buildValue(Json.Arr);
WHILE buildArray # NIL DO WHILE buildArray # NIL DO
IF buildArray.value IS Json.Obj THEN
buildStep := buildArray.value(Json.Obj); buildStep := buildArray.value(Json.Obj);
NEW(cm, Strings.Length(vpkSettings.bldCommand) + 1); (* +1 for 0X *) NEW(cm, Strings.Length(vpkSettings.bldCommand) + 1);
NEW(fl, Strings.Length(vpkSettings.bldFile) + 1); (* +1 for 0X *) NEW(fl, Strings.Length(vpkSettings.bldFile) + 1);
COPY(vpkSettings.bldCommand, cm^); COPY(vpkSettings.bldCommand, cm^);
COPY(vpkSettings.bldFile, fl^); COPY(vpkSettings.bldFile, fl^);
IF (d^.Type = vpkSettings.https) OR (d^.Type = vpkSettings.http) THEN
(* Handle HTTPS build steps *)
IF Json.ObjSelect(command, buildStep, cm) & Json.ObjSelect(file, buildStep, fl) THEN
IF (command IS Json.Str) & (file IS Json.Str) THEN
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;
ELSE
Out.String("Failed to select 'command' or 'file' from build step"); Out.Ln;
END;
ELSIF d^.Type = vpkSettings.git THEN
(* Handle Git build steps *)
NEW(cmLower, Strings.Length(cm^) + 1); NEW(cmLower, Strings.Length(cm^) + 1);
NEW(flLower, Strings.Length(fl^) + 1); NEW(flLower, Strings.Length(fl^) + 1);
COPY(cm^, cmLower^); COPY(cm^, cmLower^);
COPY(fl^, flLower^); COPY(fl^, flLower^);
ToLower(cmLower^); ToLower(cmLower^);
ToLower(flLower^); ToLower(flLower^);
IF Json.ObjSelect(command, buildStep, cmLower) & Json.ObjSelect(file, buildStep, flLower) THEN
IF (command IS Json.Str) & (file IS Json.Str) THEN buildStepTmp := buildStep;
IF ~Json.ObjSelect(command, buildStepTmp, cm) THEN
buildStepTmp := buildStep;
IF ~Json.ObjSelect(command, buildStepTmp, cmLower) THEN
Out.String("Failed to select 'command' from build step"); Out.Ln;
ELSE
buildStepTmp := buildStep;
IF ~Json.ObjSelect(file, buildStepTmp, fl) THEN
buildStepTmp := buildStep;
IF ~Json.ObjSelect(file, buildStepTmp, flLower) THEN
Out.String("Failed to select 'file' from build step"); Out.Ln;
ELSIF (command IS Json.Str) & (file IS Json.Str) THEN
IF k = NIL THEN k := StringList.Create() END; IF k = NIL THEN k := StringList.Create() END;
IF v = NIL THEN v := StringList.Create() END; IF v = NIL THEN v := StringList.Create() END;
k.AppendString(k, command(Json.Str).str^); k.AppendString(k, command(Json.Str).str^);
@ -84,8 +88,40 @@ BEGIN
Out.String("command and file must be strings"); Out.Ln; Out.String("command and file must be strings"); Out.Ln;
HALT(5); HALT(5);
END; END;
ELSIF (command IS Json.Str) & (file IS Json.Str) THEN
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 ELSE
Out.String("Failed to select 'command' or 'file' from build step"); Out.Ln; Out.String("command and file must be strings"); Out.Ln;
HALT(5);
END;
END;
ELSE
buildStepTmp := buildStep;
IF ~Json.ObjSelect(file, buildStepTmp, fl) THEN
buildStepTmp := buildStep;
IF ~Json.ObjSelect(file, buildStepTmp, flLower) THEN
Out.String("Failed to select 'file' from build step"); Out.Ln;
ELSIF (command IS Json.Str) & (file IS Json.Str) THEN
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;
ELSIF (command IS Json.Str) & (file IS Json.Str) THEN
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; END;
END; END;
buildArray := buildArray.next; buildArray := buildArray.next;
@ -93,9 +129,6 @@ BEGIN
ELSE ELSE
Out.String("Build section is not an array."); Out.Ln; Out.String("Build section is not an array."); Out.Ln;
END; END;
ELSE
Out.String("Build section not found."); Out.Ln;
END;
ELSE ELSE
Out.String("JSON root is not an object."); Out.Ln; Out.String("JSON root is not an object."); Out.Ln;
END; END;
@ -105,7 +138,7 @@ BEGIN
ELSE ELSE
Out.String("No JSON string provided."); Out.Ln; Out.String("No JSON string provided."); Out.Ln;
END; END;
RETURN b; RETURN (k # NIL) & (v # NIL) & (k.Count > 0);
END getBuildInfo; END getBuildInfo;
(*PROCEDURE fetchHttpsFiles(someObj: Json.Obj; VAR httpsRemote: vpkdepTree.RemoteHttps);*) (*PROCEDURE fetchHttpsFiles(someObj: Json.Obj; VAR httpsRemote: vpkdepTree.RemoteHttps);*)
@ -227,7 +260,7 @@ VAR
gitRemote: vpkdepTree.RemoteGit; gitRemote: vpkdepTree.RemoteGit;
BEGIN BEGIN
jsonstr := NIL; jsonstr := NIL;
vpkStorage.json2pstring(d.name^, jsonstr); vpkStorage.json2pstring(d.name^, d.version, jsonstr);
IF jsonstr # NIL THEN IF jsonstr # NIL THEN
NEW(errstr, ErrmessSize); NEW(errstr, ErrmessSize);
b := Json.Parse(tree, jsonstr^, errstr^); b := Json.Parse(tree, jsonstr^, errstr^);
@ -346,6 +379,7 @@ END getURIandType;
PROCEDURE getDeps*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT; PROCEDURE getDeps*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT;
VAR VAR
jsonstr, errstr: strUtils.pstring; jsonstr, errstr: strUtils.pstring;
keyLower, depKeyLower: strUtils.pstring;
tree, depsValue, singleDep: Json.Value; tree, depsValue, singleDep: Json.Value;
rootObj, depObj: Json.Obj; rootObj, depObj: Json.Obj;
depName, depVersion: Json.jString; depName, depVersion: Json.jString;
@ -353,7 +387,7 @@ VAR
BEGIN BEGIN
depstrlist := NIL; depstrlist := NIL;
jsonstr := NIL; jsonstr := NIL;
vpkStorage.json2pstring(d.name^, jsonstr); vpkStorage.json2pstring(d.name^, d.version, jsonstr);
IF jsonstr # NIL THEN IF jsonstr # NIL THEN
NEW(errstr, ErrmessSize); NEW(errstr, ErrmessSize);
IF Json.Parse(tree, jsonstr^, errstr^) THEN IF Json.Parse(tree, jsonstr^, errstr^) THEN
@ -362,7 +396,16 @@ BEGIN
(* searching for dependencies section *) (* searching for dependencies section *)
foundDepSection := FALSE; foundDepSection := FALSE;
REPEAT REPEAT
IF rootObj.name^ = vpkSettings.depTypKey THEN (*IF rootObj.name^ = vpkSettings.depTypKey THEN*)
NEW(keyLower, LEN(rootObj.name^) + 1);
COPY(rootObj.name^, keyLower^);
ToLower(keyLower^);
NEW(depKeyLower, LEN(vpkSettings.depTypKey) + 1);
COPY(vpkSettings.depTypKey, depKeyLower^);
ToLower(depKeyLower^);
IF keyLower^ = depKeyLower^ THEN
foundDepSection := TRUE; foundDepSection := TRUE;
END; END;
IF ~foundDepSection THEN rootObj := rootObj.next END IF ~foundDepSection THEN rootObj := rootObj.next END
@ -379,7 +422,19 @@ BEGIN
depName := depObj.name; depName := depObj.name;
depVersion := depObj.value(Json.Str).str; depVersion := depObj.value(Json.Str).str;
IF depstrlist = NIL THEN depstrlist := StringList.Create() END; IF depstrlist = NIL THEN depstrlist := StringList.Create() END;
IF depVersion # NIL THEN
IF depVersion^ # "" THEN
NEW(errstr, Strings.Length(depName^) + Strings.Length(depVersion^) + 2);
COPY(depName^, errstr^);
Strings.Append(":", errstr^);
Strings.Append(depVersion^, errstr^);
depstrlist.AppendString(depstrlist, errstr^);
ELSE
depstrlist.AppendString(depstrlist, depName^); depstrlist.AppendString(depstrlist, depName^);
END;
ELSE
depstrlist.AppendString(depstrlist, depName^);
END;
singleDep := depObj.next; (* Move to the next dependency *) singleDep := depObj.next; (* Move to the next dependency *)
END; END;
END; (* End of inner WHILE loop for dependencies *) END; (* End of inner WHILE loop for dependencies *)
@ -411,91 +466,101 @@ PROCEDURE getBuildInfoFromFile*(VAR d: vpkdepTree.Tdep; VAR k, v: StringList.TSt
VAR VAR
jsonstr, errstr: strUtils.pstring; jsonstr, errstr: strUtils.pstring;
tree, buildValue, command, file: Json.Value; tree, buildValue, command, file: Json.Value;
rootObj, buildStep: Json.Obj; rootObj, buildStep, rootObjTmp, buildStepTmp: Json.Obj;
buildArray: Json.Arr; buildArray: Json.Arr;
cm, fl, bl: Json.jString; cm, fl, bl, cmLower, flLower, blLower: Json.jString;
b: BOOLEAN;
BEGIN BEGIN
k := NIL; v := NIL; k := NIL; v := NIL;
b := FALSE;
jsonstr := NIL; jsonstr := NIL;
(*
Out.String("DEBUG: Reading file: "); Out.String(filename); Out.Ln;
*)
(* Read from specified file instead of package tree *)
vpkStorage.fileToString(filename, jsonstr); vpkStorage.fileToString(filename, jsonstr);
IF jsonstr # NIL THEN IF jsonstr # NIL THEN
(*
Out.String("DEBUG: JSON string loaded, length: "); Out.Int(LEN(jsonstr^), 0); Out.Ln;
*)
NEW(errstr, ErrmessSize); NEW(errstr, ErrmessSize);
b := Json.Parse(tree, jsonstr^, errstr^); IF Json.Parse(tree, jsonstr^, errstr^) THEN
IF b THEN
(*
Out.String("DEBUG: JSON parsed successfully"); Out.Ln;
*)
IF tree IS Json.Obj THEN IF tree IS Json.Obj THEN
(*
Out.String("DEBUG: Root is object"); Out.Ln;
*)
rootObj := tree(Json.Obj); rootObj := tree(Json.Obj);
NEW(bl, Strings.Length(vpkSettings.bldType) + 1); NEW(bl, Strings.Length(vpkSettings.bldType) + 1);
NEW(blLower, Strings.Length(vpkSettings.bldType) + 1);
COPY(vpkSettings.bldType, bl^); COPY(vpkSettings.bldType, bl^);
(* COPY(vpkSettings.bldType, blLower^);
Out.String("DEBUG: Looking for build key: "); Out.String(bl^); Out.Ln; ToLower(blLower^);
*)
IF Json.ObjSelect(buildValue, rootObj, bl) THEN rootObjTmp := rootObj;
(* IF ~Json.ObjSelect(buildValue, rootObjTmp, bl) THEN
Out.String("DEBUG: Found Build section"); Out.Ln; rootObjTmp := rootObj;
*) IF ~Json.ObjSelect(buildValue, rootObjTmp, blLower) THEN
Out.String("Build section not found."); Out.Ln;
RETURN FALSE
END;
END;
IF buildValue IS Json.Arr THEN IF buildValue IS Json.Arr THEN
(*
Out.String("DEBUG: Build section is array"); Out.Ln;
*)
buildArray := buildValue(Json.Arr); buildArray := buildValue(Json.Arr);
WHILE buildArray # NIL DO WHILE buildArray # NIL DO
(*
Out.String("DEBUG: Processing build array element"); Out.Ln;
*)
IF buildArray.value IS Json.Obj THEN IF buildArray.value IS Json.Obj THEN
(*
Out.String("DEBUG: Build array element is object"); Out.Ln;
*)
buildStep := buildArray.value(Json.Obj); buildStep := buildArray.value(Json.Obj);
NEW(cm, Strings.Length(vpkSettings.bldCommand) + 1); NEW(cm, Strings.Length(vpkSettings.bldCommand) + 1);
NEW(fl, Strings.Length(vpkSettings.bldFile) + 1); NEW(fl, Strings.Length(vpkSettings.bldFile) + 1);
NEW(cmLower, Strings.Length(vpkSettings.bldCommand) + 1);
NEW(flLower, Strings.Length(vpkSettings.bldFile) + 1);
COPY(vpkSettings.bldCommand, cm^); COPY(vpkSettings.bldCommand, cm^);
COPY(vpkSettings.bldFile, fl^); COPY(vpkSettings.bldFile, fl^);
(* COPY(vpkSettings.bldCommand, cmLower^);
Out.String("DEBUG: Looking for command key: "); Out.String(cm^); Out.Ln; COPY(vpkSettings.bldFile, flLower^);
Out.String("DEBUG: Looking for file key: "); Out.String(fl^); Out.Ln; ToLower(cmLower^);
*) ToLower(flLower^);
(* Simple approach - just try to get command and file directly *) buildStepTmp := buildStep;
IF Json.ObjSelect(command, buildStep, cm) & Json.ObjSelect(file, buildStep, fl) THEN IF ~Json.ObjSelect(command, buildStepTmp, cm) THEN
(* buildStepTmp := buildStep;
Out.String("DEBUG: Found both command and file keys"); Out.Ln; IF ~Json.ObjSelect(command, buildStepTmp, cmLower) THEN
*) Out.String("DEBUG: Failed to select 'command' from build step"); Out.Ln;
IF (command IS Json.Str) & (file IS Json.Str) THEN ELSE
(* buildStepTmp := buildStep;
Out.String("DEBUG: Both are strings"); Out.Ln; IF ~Json.ObjSelect(file, buildStepTmp, fl) THEN
*) buildStepTmp := buildStep;
IF ~Json.ObjSelect(file, buildStepTmp, flLower) THEN
Out.String("DEBUG: Failed to select 'file' from build step"); Out.Ln;
ELSIF (command IS Json.Str) & (file IS Json.Str) THEN
IF k = NIL THEN k := StringList.Create() END; IF k = NIL THEN k := StringList.Create() END;
IF v = NIL THEN v := StringList.Create() END; IF v = NIL THEN v := StringList.Create() END;
k.AppendString(k, command(Json.Str).str^); k.AppendString(k, command(Json.Str).str^);
v.AppendString(v, file(Json.Str).str^); v.AppendString(v, file(Json.Str).str^);
Out.String("Found build step: "); Out.String(command(Json.Str).str^); Out.String("Found build step: "); Out.String(command(Json.Str).str^);
Out.String(" "); Out.String(file(Json.Str).str^); Out.Ln; Out.String(" "); Out.String(file(Json.Str).str^); Out.Ln;
ELSE END;
(* ELSIF (command IS Json.Str) & (file IS Json.Str) THEN
Out.String("DEBUG: command and file must be strings"); 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^);
Out.String("Found build step: "); Out.String(command(Json.Str).str^);
Out.String(" "); Out.String(file(Json.Str).str^); Out.Ln;
END;
END; END;
ELSE ELSE
Out.String("DEBUG: Failed to select 'command' or 'file' from build step"); Out.Ln; buildStepTmp := buildStep;
IF ~Json.ObjSelect(file, buildStepTmp, fl) THEN
buildStepTmp := buildStep;
IF ~Json.ObjSelect(file, buildStepTmp, flLower) THEN
Out.String("DEBUG: Failed to select 'file' from build step"); Out.Ln;
ELSIF (command IS Json.Str) & (file IS Json.Str) THEN
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^);
Out.String("Found build step: "); Out.String(command(Json.Str).str^);
Out.String(" "); Out.String(file(Json.Str).str^); Out.Ln;
END;
ELSIF (command IS Json.Str) & (file IS Json.Str) THEN
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^);
Out.String("Found build step: "); Out.String(command(Json.Str).str^);
Out.String(" "); Out.String(file(Json.Str).str^); Out.Ln;
END;
END; END;
ELSE ELSE
Out.String("DEBUG: Build array element is not an object"); Out.Ln; Out.String("DEBUG: Build array element is not an object"); Out.Ln;
@ -505,9 +570,6 @@ BEGIN
ELSE ELSE
Out.String("Build section is not an array."); Out.Ln; Out.String("Build section is not an array."); Out.Ln;
END; END;
ELSE
Out.String("Build section not found."); Out.Ln;
END;
ELSE ELSE
Out.String("JSON root is not an object."); Out.Ln; Out.String("JSON root is not an object."); Out.Ln;
END; END;
@ -523,6 +585,8 @@ END getBuildInfoFromFile;
PROCEDURE getDepsFromFile*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT; PROCEDURE getDepsFromFile*(VAR d: vpkdepTree.Tdep; VAR depstrlist: StringList.TStringList): LONGINT;
VAR VAR
jsonstr, errstr: strUtils.pstring; jsonstr, errstr: strUtils.pstring;
keyLower, depKeyLower: strUtils.pstring;
depWithVersion: strUtils.pstring;
tree, depsValue, singleDep: Json.Value; tree, depsValue, singleDep: Json.Value;
rootObj, depObj: Json.Obj; rootObj, depObj: Json.Obj;
depName, depVersion: Json.jString; depName, depVersion: Json.jString;
@ -548,7 +612,16 @@ BEGIN
(* searching for dependencies section *) (* searching for dependencies section *)
foundDepSection := FALSE; foundDepSection := FALSE;
REPEAT REPEAT
IF rootObj.name^ = vpkSettings.depTypKey THEN (*IF rootObj.name^ = vpkSettings.depTypKey THEN*)
NEW(keyLower, LEN(rootObj.name^) + 1);
COPY(rootObj.name^, keyLower^);
ToLower(keyLower^);
NEW(depKeyLower, LEN(vpkSettings.depTypKey) + 1);
COPY(vpkSettings.depTypKey, depKeyLower^);
ToLower(depKeyLower^);
IF keyLower^ = depKeyLower^ THEN
foundDepSection := TRUE; foundDepSection := TRUE;
END; END;
IF ~foundDepSection THEN rootObj := rootObj.next END IF ~foundDepSection THEN rootObj := rootObj.next END
@ -565,7 +638,37 @@ BEGIN
depName := depObj.name; depName := depObj.name;
depVersion := depObj.value(Json.Str).str; depVersion := depObj.value(Json.Str).str;
IF depstrlist = NIL THEN depstrlist := StringList.Create() END; IF depstrlist = NIL THEN depstrlist := StringList.Create() END;
IF depVersion # NIL THEN
IF depVersion^ # "" THEN
NEW(errstr, Strings.Length(depName^) + Strings.Length(depVersion^) + 2);
COPY(depName^, errstr^);
Strings.Append(":", errstr^);
Strings.Append(depVersion^, errstr^);
depstrlist.AppendString(depstrlist, errstr^);
ELSE
(*depstrlist.AppendString(depstrlist, depName^);*)
IF depVersion # NIL THEN
NEW(depWithVersion, LEN(depName^) + LEN(depVersion^) + 2);
COPY(depName^, depWithVersion^);
Strings.Append(":", depWithVersion^);
Strings.Append(depVersion^, depWithVersion^);
depstrlist.AppendString(depstrlist, depWithVersion^);
ELSE
depstrlist.AppendString(depstrlist, depName^); depstrlist.AppendString(depstrlist, depName^);
END;
END;
ELSE
(*depstrlist.AppendString(depstrlist, depName^);*)
IF depVersion # NIL THEN
NEW(depWithVersion, LEN(depName^) + LEN(depVersion^) + 2);
COPY(depName^, depWithVersion^);
Strings.Append(":", depWithVersion^);
Strings.Append(depVersion^, depWithVersion^);
depstrlist.AppendString(depstrlist, depWithVersion^);
ELSE
depstrlist.AppendString(depstrlist, depName^);
END;
END;
singleDep := depObj.next; (* Move to the next dependency *) singleDep := depObj.next; (* Move to the next dependency *)
END; END;
END; (* End of inner WHILE loop for dependencies *) END; (* End of inner WHILE loop for dependencies *)

View file

@ -108,8 +108,6 @@ BEGIN
Strings.Append(eol, content); Strings.Append(eol, content);
Strings.Append(' "License": "GPL-3",', content); Strings.Append(' "License": "GPL-3",', content);
Strings.Append(eol, content); Strings.Append(eol, content);
Strings.Append(' "Version": "0.1",', content);
Strings.Append(eol, content);
Strings.Append(' "Remote": {', content); Strings.Append(' "Remote": {', content);
Strings.Append(eol, content); Strings.Append(eol, content);
Strings.Append(' "type": "git",', content); Strings.Append(' "type": "git",', content);
@ -167,10 +165,10 @@ END fileExists;
PROCEDURE parseProjectFile(VAR filename: ARRAY OF CHAR; VAR info: ProjectInfo): BOOLEAN; PROCEDURE parseProjectFile(VAR filename: ARRAY OF CHAR; VAR info: ProjectInfo): BOOLEAN;
VAR VAR
jsonstr, errstr: strUtils.pstring; jsonstr, errstr: strUtils.pstring;
tree, packageValue, authorValue, licenseValue, versionValue: Json.Value; tree, packageValue, authorValue, licenseValue: Json.Value;
depsValue, buildValue: Json.Value; depsValue, buildValue: Json.Value;
rootObj: Json.Obj; rootObj: Json.Obj;
packageKey, authorKey, licenseKey, versionKey: Json.jString; packageKey, authorKey, licenseKey: Json.jString;
depsKey, buildKey: Json.jString; depsKey, buildKey: Json.jString;
b: BOOLEAN; b: BOOLEAN;
BEGIN BEGIN
@ -214,12 +212,8 @@ BEGIN
END; END;
END; END;
(* Parse Version *) IF ~vpkStorage.versionFromPackageFileName(filename, info.version) THEN
NEW(versionKey, 8); COPY("Version", versionKey^); COPY("", info.version);
IF Json.ObjSelect(versionValue, rootObj, versionKey) THEN
IF versionValue IS Json.Str THEN
COPY(versionValue(Json.Str).str^, info.version);
END;
END; END;
(* Check for Dependencies *) (* Check for Dependencies *)

View file

@ -1,5 +1,5 @@
MODULE vpkResolver; MODULE vpkResolver;
IMPORT Out, StringList, vpkdepTree; IMPORT Out, Strings, StringList, vpkdepTree;
TYPE TYPE
pstr = StringList.pstring; pstr = StringList.pstring;
@ -10,6 +10,34 @@ TYPE
VAR rtvr: vpkdepTree.retriever; VAR rtvr: vpkdepTree.retriever;
PROCEDURE SplitDepSpec(VAR spec, depName, depVersion: ARRAY OF CHAR);
VAR
i, l: INTEGER;
BEGIN
COPY("", depName);
COPY("", depVersion);
l := Strings.Length(spec);
i := 0;
WHILE (i < l) & (spec[i] # ':') DO
depName[i] := spec[i];
INC(i);
END;
depName[i] := 0X;
IF i < l THEN
INC(i);
WHILE i <= l DO
depVersion[i - (Strings.Length(depName) + 1)] := spec[i];
INC(i);
END;
END;
END SplitDepSpec;
PROCEDURE sameDep(VAR d1, d2: Tdep): BOOLEAN;
BEGIN
IF (d1 = NIL) OR (d2 = NIL) THEN RETURN FALSE END;
RETURN (d1.name^ = d2.name^) & (d1.version = d2.version);
END sameDep;
PROCEDURE treeContains(VAR d: Tdep; VAR depTree: TdepTree): BOOLEAN; PROCEDURE treeContains(VAR d: Tdep; VAR depTree: TdepTree): BOOLEAN;
VAR VAR
res: BOOLEAN; res: BOOLEAN;
@ -21,8 +49,7 @@ BEGIN
REPEAT REPEAT
d2 := depTree.Get(depTree, i); d2 := depTree.Get(depTree, i);
IF d2 # NIL THEN IF d2 # NIL THEN
IF d = d2 THEN res := TRUE END; IF sameDep(d, d2) THEN res := TRUE END;
(*IF d.name^ = d2.name^ THEN res := TRUE END *)
END; END;
INC(i) INC(i)
UNTIL res OR (i >= depTree.Count); UNTIL res OR (i >= depTree.Count);
@ -40,15 +67,13 @@ BEGIN
REPEAT REPEAT
d2 := depTree.Get(depTree, i); d2 := depTree.Get(depTree, i);
IF d2 # NIL THEN IF d2 # NIL THEN
IF d.name^ = d2.name^ THEN res := TRUE END; IF sameDep(d, d2) THEN res := TRUE END;
(*IF d.name^ = d2.name^ THEN res := TRUE END *)
END; END;
INC(i) INC(i)
UNTIL res OR (i >= depTree.Count); UNTIL res OR (i >= depTree.Count);
RETURN res; RETURN res;
END treeContainsByName; END treeContainsByName;
PROCEDURE mkDepTree(VAR d: Tdep; VAR depTree, met: TdepTree); PROCEDURE mkDepTree(VAR d: Tdep; VAR depTree, met: TdepTree);
VAR VAR
depStrs: StringList.TStringList; depStrs: StringList.TStringList;
@ -57,6 +82,7 @@ VAR
p: pstr; p: pstr;
i: INTEGER; i: INTEGER;
rtrvRes: LONGINT; rtrvRes: LONGINT;
depName, depVersion: ARRAY 128 OF CHAR;
BEGIN BEGIN
vpkdepTree.Add(met, d); vpkdepTree.Add(met, d);
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;
@ -69,23 +95,31 @@ BEGIN
HALT(62); HALT(62);
END; END;
IF depStrs # NIL THEN IF depStrs # NIL THEN
(*IF rtrvRes > 0 THEN*) 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
SplitDepSpec(p^, depName, depVersion);
t := NIL; t := NIL;
t := met.GetByName(met, p^); t := met.GetByNameVersion(met, depName, depVersion);
IF t = NIL THEN IF t = NIL THEN
t := vpkdepTree.CreateDep(p^); IF depVersion = "" THEN
t := vpkdepTree.CreateDep(depName)
ELSE
t := vpkdepTree.CreateDepVersioned(depName, depVersion)
END;
t.InstallRetriever(t, rtvr); t.InstallRetriever(t, rtvr);
END; END;
deps[i] := t; deps[i] := t;
IF ~treeContainsByName(t, depTree) THEN IF ~treeContainsByName(t, depTree) THEN
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^);
IF d.version # "" THEN Out.String(":"); Out.String(d.version) END;
Out.String(" requires "); Out.String(t.name^);
IF t.version # "" THEN Out.String(":"); Out.String(t.version) END;
Out.Ln;
Out.String("unable to continue."); Out.Ln; Out.String("unable to continue."); Out.Ln;
HALT(60) HALT(60)
ELSE ELSE
@ -105,11 +139,17 @@ VAR
depTree: TdepTree; depTree: TdepTree;
met: TdepTree; met: TdepTree;
dep: Tdep; dep: Tdep;
depName, depVersion: ARRAY 128 OF CHAR;
BEGIN BEGIN
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); SplitDepSpec(first, depName, depVersion);
IF depVersion = "" THEN
dep := vpkdepTree.CreateDep(depName)
ELSE
dep := vpkdepTree.CreateDepVersioned(depName, depVersion)
END;
dep.InstallRetriever(dep, rtvr); dep.InstallRetriever(dep, rtvr);
mkDepTree(dep, depTree, met); mkDepTree(dep, depTree, met);
RETURN depTree RETURN depTree

View file

@ -1,6 +1,6 @@
MODULE vpkStorage; MODULE vpkStorage;
IMPORT Files, Out, Strings, IMPORT Files, Out, Strings,
strUtils, vpkLogger, vpkEnv, UnixFS; strUtils, vpkLogger, vpkEnv, UnixFS;
PROCEDURE WriteString(VAR r : Files.Rider; str : ARRAY OF CHAR); PROCEDURE WriteString(VAR r : Files.Rider; str : ARRAY OF CHAR);
BEGIN BEGIN
@ -18,26 +18,25 @@ BEGIN
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 + 1);
j := 0; j := 0;
REPEAT REPEAT
Files.Read(r, returnString^[j]); Files.Read(r, returnString^[j]);
INC(j); INC(j);
UNTIL r.eof OR (j >= i); UNTIL r.eof OR (j >= i);
returnString^[j] := 0X;
ELSE ELSE
Out.String("file "); Out.String("file ");
Out.String(fileName); Out.String(fileName);
Out.String(" not found"); Out.String(" not found");
Out.Ln; Out.Ln;
END; END;
END fileToString; END fileToString;
PROCEDURE stringToFile*(VAR fileName, content: ARRAY OF CHAR): BOOLEAN; PROCEDURE stringToFile*(VAR fileName, content: ARRAY OF CHAR): BOOLEAN;
VAR VAR
f: Files.File; f: Files.File;
r: Files.Rider; r: Files.Rider;
i: LONGINT;
BEGIN BEGIN
f := Files.New(fileName); f := Files.New(fileName);
@ -59,17 +58,213 @@ BEGIN
RETURN TRUE; RETURN TRUE;
END stringToFile; END stringToFile;
PROCEDURE json2pstring*(VAR json: ARRAY OF CHAR; VAR pstr: strUtils.pstring); PROCEDURE EndsWith(s: ARRAY OF CHAR; suffix: ARRAY OF CHAR): BOOLEAN;
VAR VAR
fi: UnixFS.fileInfo; 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 EndsWith;
PROCEDURE StripSuffix(s: ARRAY OF CHAR; suffix: ARRAY OF CHAR; VAR out: ARRAY OF CHAR): BOOLEAN;
VAR
ls, lf, i: INTEGER;
BEGIN
COPY("", out);
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;
i := 0;
WHILE i < ls - lf DO
out[i] := s[i];
INC(i)
END;
out[i] := 0X;
RETURN TRUE
END StripSuffix;
PROCEDURE BaseName(path: ARRAY OF CHAR; VAR base: ARRAY OF CHAR);
VAR
i, start, j: INTEGER;
BEGIN
start := 0;
i := 0;
WHILE path[i] # 0X DO
IF path[i] = "/" THEN start := i + 1 END;
INC(i)
END;
j := 0;
i := start;
WHILE path[i] # 0X DO
base[j] := path[i];
INC(i); INC(j)
END;
base[j] := 0X
END BaseName;
PROCEDURE DirName(path: ARRAY OF CHAR; VAR dir: ARRAY OF CHAR);
VAR
i, lastSlash: INTEGER;
BEGIN
lastSlash := -1;
i := 0;
WHILE path[i] # 0X DO
IF path[i] = "/" THEN lastSlash := i END;
INC(i)
END;
IF lastSlash < 0 THEN
COPY("", dir)
ELSE
i := 0;
WHILE i < lastSlash DO
dir[i] := path[i];
INC(i)
END;
dir[i] := 0X
END
END DirName;
PROCEDURE LastPathComponent(path: ARRAY OF CHAR; VAR comp: ARRAY OF CHAR);
VAR
dir: ARRAY 512 OF CHAR;
BEGIN
DirName(path, dir);
BaseName(dir, comp)
END LastPathComponent;
PROCEDURE ParseNat(s: ARRAY OF CHAR; VAR pos: INTEGER): INTEGER;
VAR n: INTEGER;
BEGIN
n := 0;
WHILE (s[pos] >= "0") & (s[pos] <= "9") DO
n := n * 10 + (ORD(s[pos]) - ORD("0"));
INC(pos)
END;
RETURN n
END ParseNat;
PROCEDURE CompareVersions*(a, b: ARRAY OF CHAR): INTEGER;
VAR
ia, ib, va, vb: INTEGER;
BEGIN
ia := 0; ib := 0;
WHILE (a[ia] # 0X) OR (b[ib] # 0X) DO
va := 0; vb := 0;
IF (a[ia] >= "0") & (a[ia] <= "9") THEN va := ParseNat(a, ia) END;
IF (b[ib] >= "0") & (b[ib] <= "9") THEN vb := ParseNat(b, ib) END;
IF va < vb THEN RETURN -1 END;
IF va > vb THEN RETURN 1 END;
IF a[ia] = "." THEN INC(ia) END;
IF b[ib] = "." THEN INC(ib) END;
END;
RETURN 0
END CompareVersions;
PROCEDURE versionFromPackageFileName*(path: ARRAY OF CHAR; VAR version: ARRAY OF CHAR): BOOLEAN;
VAR
base, stem, pkg, prefix: ARRAY 512 OF CHAR;
i, lp, ls: INTEGER;
jsonSuffix: ARRAY 16 OF CHAR;
BEGIN
COPY(".json", jsonSuffix);
COPY("", version);
BaseName(path, base);
IF ~StripSuffix(base, jsonSuffix, stem) THEN RETURN FALSE END;
LastPathComponent(path, pkg);
COPY(pkg, prefix);
Strings.Append("-", prefix);
lp := Strings.Length(prefix);
ls := Strings.Length(stem);
IF ls < lp THEN RETURN FALSE END;
i := 0;
WHILE i < lp DO
IF stem[i] # prefix[i] THEN RETURN FALSE END;
INC(i)
END;
i := 0;
WHILE stem[lp + i] # 0X DO
version[i] := stem[lp + i];
INC(i)
END;
version[i] := 0X;
RETURN version # ""
END versionFromPackageFileName;
PROCEDURE findPackageJsonPath*(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, jsonSuffix: ARRAY 16 OF CHAR;
BEGIN
COPY("", path);
COPY("", bestVersion);
COPY("", emptyVersion);
COPY(".json", jsonSuffix);
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;
i := 0;
WHILE i < LEN(lst^) DO
IF (lst^[i].name # ".") & (lst^[i].name # "..") THEN
IF EndsWith(lst^[i].name, jsonSuffix) THEN
COPY(dirPath, fullPath);
Strings.Append("/", fullPath);
Strings.Append(lst^[i].name, fullPath);
IF versionFromPackageFileName(fullPath, currentVersion) 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;
INC(i)
END;
RETURN found
END findPackageJsonPath;
PROCEDURE json2pstring*(pkgName, reqVersion: ARRAY OF CHAR; VAR pstr: strUtils.pstring);
VAR
path: ARRAY 512 OF CHAR;
BEGIN BEGIN
pstr := NIL; pstr := NIL;
vpkEnv.getTreeDir(fi.name); IF findPackageJsonPath(pkgName, reqVersion, path) THEN
Strings.Append("/", fi.name); fileToString(path, pstr)
Strings.Append(json, fi.name);
Strings.Append(".json", fi.name);
IF UnixFS.Exists(fi) THEN
fileToString(fi.name, pstr);
END END
END json2pstring; END json2pstring;

View file

@ -3,8 +3,6 @@ IMPORT Out, Strings,
strUtils, List, StringList, strUtils, List, StringList,
vpkSettings; vpkSettings;
TYPE TYPE
pstring = strUtils.pstring; pstring = strUtils.pstring;
@ -24,6 +22,7 @@ TYPE
Add* : PROCEDURE (VAR l : TdepTree; VAR s : Tdep); Add* : PROCEDURE (VAR l : TdepTree; VAR s : Tdep);
Get* : PROCEDURE (VAR l : TdepTree; i : LONGINT): Tdep; Get* : PROCEDURE (VAR l : TdepTree; i : LONGINT): Tdep;
GetByName* : PROCEDURE (VAR l : TdepTree; VAR name : ARRAY OF CHAR): Tdep; GetByName* : PROCEDURE (VAR l : TdepTree; VAR name : ARRAY OF CHAR): Tdep;
GetByNameVersion* : PROCEDURE (VAR l : TdepTree; VAR name, version : ARRAY OF CHAR): Tdep;
Empty* : PROCEDURE (VAR l : TdepTree) : BOOLEAN; Empty* : PROCEDURE (VAR l : TdepTree) : BOOLEAN;
Count* : LONGINT; Count* : LONGINT;
END; END;
@ -63,6 +62,7 @@ TYPE
TdepDesc* = RECORD TdepDesc* = RECORD
prev-, next-: Tdep; prev-, next-: Tdep;
name- : pstring; name- : pstring;
version* : ARRAY 64 OF CHAR;
deps- : Tdeps; deps- : Tdeps;
Create* : PROCEDURE (VAR name: ARRAY OF CHAR): Tdep; Create* : PROCEDURE (VAR name: ARRAY OF CHAR): Tdep;
AssignDeps* : PROCEDURE (VAR d: Tdep; VAR deps: Tdeps); AssignDeps* : PROCEDURE (VAR d: Tdep; VAR deps: Tdeps);
@ -90,13 +90,25 @@ BEGIN
NEW(dep); NEW(dep);
NEW(dep.name, Strings.Length(name) + 1); NEW(dep.name, Strings.Length(name) + 1);
COPY(name, dep.name^); COPY(name, dep.name^);
COPY("", dep.version);
dep.AssignDeps := AssignDeps; dep.AssignDeps := AssignDeps;
dep.InstallRetriever := InstallRetriever; dep.InstallRetriever := InstallRetriever;
dep.RetrieveDeps := NIL; dep.RetrieveDeps := NIL;
dep.rmt := NIL; dep.rmt := NIL;
dep.Type := 0;
dep.Create := CreateDep;
RETURN dep RETURN dep
END CreateDep; END CreateDep;
PROCEDURE CreateDepVersioned*(VAR name, version: ARRAY OF CHAR): Tdep;
VAR
dep: Tdep;
BEGIN
dep := CreateDep(name);
COPY(version, dep.version);
RETURN dep
END CreateDepVersioned;
PROCEDURE list(VAR s : StringList.TStringList); PROCEDURE list(VAR s : StringList.TStringList);
VAR e : StringList.Node; VAR e : StringList.Node;
i : INTEGER; i : INTEGER;
@ -106,7 +118,6 @@ BEGIN
REPEAT REPEAT
e := s.Get(s, i); e := s.Get(s, i);
IF e # NIL THEN Out.String (e.obj(StringList.TString).str^); Out.Ln END; IF e # NIL THEN Out.String (e.obj(StringList.TString).str^); Out.Ln END;
(*Out.String (e.string); Out.Ln;*)
INC(i); INC(i);
UNTIL i = s.Count - 1; UNTIL i = s.Count - 1;
END list; END list;
@ -117,61 +128,73 @@ VAR
BEGIN BEGIN
l := 0; l := 0;
REPEAT REPEAT
Out.Int(l, 0); Out.String(": "); Out.String(deps[l].name^); Out.Ln; Out.Int(l, 0); Out.String(": "); Out.String(deps[l].name^);
IF deps[l].version # "" THEN
Out.String(":"); Out.String(deps[l].version);
END;
Out.Ln;
INC(l); INC(l);
UNTIL l = LEN(deps^) - 1; UNTIL l = LEN(deps^) - 1;
END listDeps; END listDeps;
PROCEDURE Free*(VAR l : TdepTree); PROCEDURE Free*(VAR l : TdepTree);
BEGIN BEGIN
l := NIL l := NIL
END Free; END Free;
PROCEDURE Clear*(VAR l : TdepTree); PROCEDURE Clear*(VAR l : TdepTree);
BEGIN BEGIN
l.First := NIL; l.First := NIL;
l.Last := NIL;
l.Count := 0; l.Count := 0;
END Clear; END Clear;
PROCEDURE Empty* (VAR l : TdepTree) : BOOLEAN; PROCEDURE Empty*(VAR l : TdepTree) : BOOLEAN;
BEGIN BEGIN
RETURN l.First = NIL RETURN l.First = NIL
END Empty; END Empty;
PROCEDURE Add* (VAR l : TdepTree; VAR d: Tdep); PROCEDURE Add*(VAR l : TdepTree; VAR d: Tdep);
BEGIN BEGIN
IF l.First = NIL THEN IF l.First = NIL THEN
l.First := d; l.First := d;
d.prev := NIL;
ELSE ELSE
l.Last.next := d; l.Last.next := d;
d.prev := l.Last;
END; END;
l.Last := d; l.Last := d;
l.Last.next := NIL; l.Last.next := NIL;
INC(l.Count); INC(l.Count);
END Add; END Add;
PROCEDURE AddCopy* (VAR l : TdepTree; VAR d: Tdep); PROCEDURE AddCopy*(VAR l : TdepTree; VAR d: Tdep);
VAR VAR
new: Tdep; new: Tdep;
ln: INTEGER; ln: INTEGER;
BEGIN BEGIN
NEW(new); NEW(new);
new.prev := d.prev; new.next := d.next; new.prev := d.prev; new.next := d.next;
ln := Strings.Length(d.name^) + 1; NEW(new.name, ln); COPY(d.name^, new.name^); ln := Strings.Length(d.name^) + 1; NEW(new.name, ln); COPY(d.name^, new.name^);
COPY(d.version, new.version);
new.deps := d.deps; new.deps := d.deps;
new.Create := d.Create; new.AssignDeps := d.AssignDeps; new.Create := d.Create; new.AssignDeps := d.AssignDeps;
new.RetrieveDeps := d.RetrieveDeps; new.RetrieveDeps := d.RetrieveDeps;
new.InstallRetriever := d.InstallRetriever; new.InstallRetriever := d.InstallRetriever;
new.Type := d.Type;
new.rmt := d.rmt;
IF l.First = NIL THEN IF l.First = NIL THEN
l.First := new; l.First := new;
new.prev := NIL;
ELSE ELSE
l.Last.next := new; l.Last.next := new;
new.prev := l.Last;
END; END;
l.Last := new; l.Last := new;
l.Last.next := NIL; l.Last.next := NIL;
INC(l.Count); INC(l.Count);
END AddCopy; END AddCopy;
PROCEDURE Get*(VAR l: TdepTree; inx: LONGINT): Tdep; PROCEDURE Get*(VAR l: TdepTree; inx: LONGINT): Tdep;
VAR VAR
@ -181,7 +204,6 @@ BEGIN
d := NIL; d := NIL;
i := 0; i := 0;
IF (inx < l.Count) & (inx >= 0) THEN IF (inx < l.Count) & (inx >= 0) THEN
i := 0;
d := l.First; d := l.First;
WHILE i # inx DO WHILE i # inx DO
IF d # NIL THEN d := d.next END; IF d # NIL THEN d := d.next END;
@ -193,31 +215,37 @@ END Get;
PROCEDURE GetByName*(VAR l: TdepTree; VAR name: ARRAY OF CHAR): Tdep; PROCEDURE GetByName*(VAR l: TdepTree; VAR name: ARRAY OF CHAR): Tdep;
VAR VAR
i: LONGINT;
d: Tdep; d: Tdep;
fnd: BOOLEAN;
BEGIN BEGIN
fnd := FALSE;
i := 0;
d := l.First; d := l.First;
REPEAT WHILE d # NIL DO
IF d # NIL THEN
IF d.name^ = name THEN IF d.name^ = name THEN
fnd := TRUE;
RETURN d; RETURN d;
ELSE
d := d.next
END
END; END;
INC(i); d := d.next
(* UNTIL fnd OR (i >= l.Count );*) END;
UNTIL fnd OR (d = NIL); RETURN NIL;
RETURN NIL; (* in case of this UNTIL it seems safe to RETURN d *)
END GetByName; END GetByName;
PROCEDURE Create* () : TdepTree; PROCEDURE GetByNameVersion*(VAR l: TdepTree; VAR name, version: ARRAY OF CHAR): Tdep;
VAR l : TdepTree; VAR
BEGIN d: Tdep;
BEGIN
d := l.First;
WHILE d # NIL DO
IF d.name^ = name THEN
IF (version = "") OR (d.version = version) THEN
RETURN d;
END;
END;
d := d.next
END;
RETURN NIL;
END GetByNameVersion;
PROCEDURE Create*() : TdepTree;
VAR l : TdepTree;
BEGIN
NEW(l); NEW(l);
l.First := NIL; l.First := NIL;
l.Last := NIL; l.Last := NIL;
@ -225,11 +253,12 @@ PROCEDURE Create* () : TdepTree;
l.Add := Add; l.Add := Add;
l.Get := Get; l.Get := Get;
l.GetByName := GetByName; l.GetByName := GetByName;
l.GetByNameVersion := GetByNameVersion;
l.Clear := Clear; l.Clear := Clear;
l.Free := Free; l.Free := Free;
l.Empty := Empty; l.Empty := Empty;
RETURN(l); l.Create := Create;
END Create; RETURN l;
END Create;
END vpkdepTree. END vpkdepTree.