mirror of
https://github.com/vishapoberon/vipak.git
synced 2026-07-09 19:03:31 +00:00
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:
parent
2e048857ee
commit
b99aed83c7
6 changed files with 592 additions and 230 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 *)
|
||||||
|
|
|
||||||
|
|
@ -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 *)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue