Version files are able to download

This commit is contained in:
Ruben Shekspir 2019-05-12 12:07:02 +04:00
parent e896987c66
commit 70e1e1efe4
10 changed files with 178 additions and 126 deletions

3
.gitignore vendored
View file

@ -1 +1,2 @@
builds/* builds/*
dependencies/*

View file

@ -10,64 +10,111 @@ VAR
j : LONGINT; j : LONGINT;
PROCEDURE Resolve *(jsonString: ARRAY OF CHAR); PROCEDURE ResolveVersionFiles *(jsonString: ARRAY OF CHAR);
VAR VAR
jsonRecord, dependencies: JsonParser.JsonTypePointer; jsonRecord, dependencies: JsonParser.JsonTypePointer;
keyFound: BOOLEAN; keyFound: BOOLEAN;
packageName, version, returnedJSON: JsonParser.TString; packageName, version, filePath: ARRAY 32 OF CHAR;
returnedJSON: JsonParser.TString;
keys: ARRAY ArrayMaxNumber OF JsonParser.TString; keys: ARRAY ArrayMaxNumber OF JsonParser.TString;
i, k : LONGINT; i, k : LONGINT;
BEGIN BEGIN
jsonRecord := JsonParser.Create(jsonString); jsonRecord := JsonParser.Create(jsonString);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Package", packageName); keyFound := jsonRecord.GetTerminal(jsonRecord, "Package", packageName);
IF keyFound THEN IF keyFound THEN
Logger.Log("Parsing package by name"); Logger.Log("Parsing package by name");
Logger.Log(packageName); Logger.Log(packageName);
Logger.Log("------------------------"); Logger.Log("------------------------");
ELSE Logger.Log("Value for the Key is not found"); RETURN; END; ELSE Logger.Log("Value for the Key is not found"); RETURN; END;
dependencies := jsonRecord.GetNonTerminal(jsonRecord, "Dependencies");
dependencies.GetTerminalKeys(dependencies, keys);
FOR i := 0 TO LEN(keys) - 1 DO (* TODO: rewrite this logic to work with key count *) dependencies := jsonRecord.GetNonTerminal(jsonRecord, "Dependencies");
IF ~Strings.Match(keys[i], "") THEN
keyFound := dependencies.GetTerminal(dependencies, keys[i], version);
IF ~keyFound THEN Logger.Log('ERROR while seatching key'); Logger.Log(keys[i]); END;
ASSERT(keyFound);
PackageResolver.ResolveFile( IF dependencies = NIL THEN
Settings.host, Logger.Log("Parsing package by name");
Settings.port, Logger.Log(packageName);
keys[i], Logger.Log("Error");
version, Logger.Log("No dependency");
Settings.packageFileName, Logger.Log("------------------------");
returnedJSON END;
);
dependencies.GetTerminalKeys(dependencies, keys);
keyFound := FALSE;
IF j >= LEN(moduleNames) THEN
Logger.Log("Out of range in Resolve function in ...");
END;
ASSERT(j < LEN(moduleNames));
FOR k := 0 TO j - 1 DO
IF Strings.Match(moduleNames[k], keys[i]) THEN
keyFound := TRUE;
END;
END;
IF ~keyFound THEN FOR i := 0 TO dependencies.TerminalNumber - 1 DO (* TODO: rewrite this logic to work with key count *)
COPY(keys[i], moduleNames[j]); keyFound := dependencies.GetTerminal(dependencies, keys[i], version);
COPY(version, moduleVersions[j]);
COPY(returnedJSON, moduleJson[j]); IF ~keyFound THEN Logger.Log('ERROR while searching key'); Logger.Log(keys[i]); END;
INC(j); ASSERT(keyFound);
Resolve(returnedJSON);
COPY("", filePath);
Strings.Append("/", filePath);
Strings.Append(keys[i], filePath);
Strings.Append("/", filePath);
Strings.Append(version, filePath);
Strings.Append("/", filePath);
Strings.Append(Settings.packageFileName, filePath);
JsonParser.Empty(returnedJSON);
PackageResolver.ResolveFile(
Settings.host,
Settings.port,
filePath,
keys[i],
version,
Settings.packageFileName,
returnedJSON
);
keyFound := FALSE;
IF j >= LEN(moduleNames) THEN
Logger.Log("Out of range in ResolveVersionFiles function in ...");
END;
ASSERT(j < LEN(moduleNames));
FOR k := 0 TO j - 1 DO
IF Strings.Match(moduleNames[k], keys[i]) THEN
keyFound := TRUE;
END; END;
END; END;
IF ~keyFound THEN
COPY(keys[i], moduleNames[j]);
COPY(version, moduleVersions[j]);
COPY(returnedJSON, moduleJson[j]);
INC(j);
ResolveVersionFiles(returnedJSON);
END;
END; END;
END Resolve; END ResolveVersionFiles;
PROCEDURE ResolvePackages*();
VAR
i, j: LONGINT;
keyFound: BOOLEAN;
jsonRecord, filesRecord: JsonParser.JsonTypePointer;
values: ARRAY ArrayMaxNumber OF JsonParser.TString;
host, port, path, packageName, version: JsonParser.TString;
BEGIN
FOR i := 0 TO j - 1 DO
IF ~Strings.Match(moduleNames[i], "") THEN
jsonRecord := JsonParser.Create(moduleJson[i]);
filesRecord := jsonRecord.GetNonTerminal(jsonRecord, "Files");
IF filesRecord = NIL THEN
Logger.Log("Error: no files section found");
END;
ASSERT(filesRecord # NIL);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Remote", host);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Port", port);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Path", path);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Package", packageName);
keyFound := jsonRecord.GetTerminal(jsonRecord, "Version", version);
filesRecord.GetTerminalValues(filesRecord, values);
PackageResolver.Resolve(host, port, path, packageName, version, values);
END;
END;
END ResolvePackages;
END DependencyResolver. END DependencyResolver.

View file

@ -1,13 +1,13 @@
MODULE JsonParser; MODULE JsonParser;
IMPORT Logger, CharacterStack, Strings, Out, strutils; IMPORT Logger, CharacterStack, Strings, Out, strutils, Settings;
CONST CONST
ArrayMaxNumber = 30; ArrayMaxNumber = 30;
ArrayMaxNumberChar = 10000; ArrayMaxNumberChar = 1000;
(* Const *) (* Const *)
symbolBracketStart = "{"; symbolBracketStart = "{";
symbolBracketEnd = "}"; symbolBracketEnd = "}";
(* TODO: Reverse " and ' *) (* TODO: Reverse " and ' *)
quote = "'"; quote = Settings.quote;
coma = ","; coma = ",";
TYPE TYPE
TString* = ARRAY ArrayMaxNumberChar OF CHAR; TString* = ARRAY ArrayMaxNumberChar OF CHAR;
@ -20,13 +20,18 @@ TYPE
HasKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): BOOLEAN; HasKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR): BOOLEAN;
TypeOfTheKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR); TypeOfTheKey* : PROCEDURE(self : JsonTypePointer; key : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR);
GetTerminalKeys* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString); GetTerminalKeys* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString);
GetTerminalValues* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString);
GetNoneTerminalKeys* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString); GetNoneTerminalKeys* : PROCEDURE(self : JsonTypePointer; VAR destination : ARRAY OF TString);
GetTerminalNumber* : PROCEDURE(self : JsonTypePointer): LONGINT;
GetNonTerminalNumber* : PROCEDURE(self : JsonTypePointer): LONGINT;
TerminalKeys : ARRAY ArrayMaxNumber OF TString; TerminalKeys : ARRAY ArrayMaxNumber OF TString;
TerminalsValues : ARRAY ArrayMaxNumber OF TString; TerminalValues : ARRAY ArrayMaxNumber OF TString;
TerminalNumber* : LONGINT;
NonTerminalKeys : ARRAY ArrayMaxNumber OF TString; NonTerminalKeys : ARRAY ArrayMaxNumber OF TString;
NonTerminalValues : POINTER TO ARRAY OF JsonTypePointer; NonTerminalValues : POINTER TO ARRAY OF JsonTypePointer;
NonTerminalNumber* : LONGINT;
END; END;
VAR VAR
@ -34,18 +39,24 @@ VAR
testValue: ARRAY ArrayMaxNumber OF CHAR; testValue: ARRAY ArrayMaxNumber OF CHAR;
keyFound: BOOLEAN; keyFound: BOOLEAN;
PROCEDURE GetTerminalNumber*(self : JsonTypePointer): LONGINT;
BEGIN RETURN self.TerminalNumber END GetTerminalNumber;
PROCEDURE GetNonTerminalNumber*(self : JsonTypePointer): LONGINT;
BEGIN RETURN self.NonTerminalNumber END GetNonTerminalNumber;
PROCEDURE GetNonTerminal(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer; PROCEDURE GetNonTerminal(self : JsonTypePointer; key : ARRAY OF CHAR): JsonTypePointer;
VAR VAR
i: LONGINT; i: LONGINT;
BEGIN BEGIN
FOR i := 0 TO LEN(self.NonTerminalKeys) - 1 DO FOR i := 0 TO self.NonTerminalNumber - 1 DO
IF Strings.Match(key, self.NonTerminalKeys[i]) THEN RETURN self.NonTerminalValues[i] END; IF Strings.Match(key, self.NonTerminalKeys[i]) THEN RETURN self.NonTerminalValues[i] END;
END; END;
RETURN NIL; RETURN NIL;
END GetNonTerminal; END GetNonTerminal;
PROCEDURE Empty(VAR string: ARRAY OF CHAR); PROCEDURE Empty *(VAR string: ARRAY OF CHAR);
VAR VAR
i : LONGINT; i : LONGINT;
BEGIN BEGIN
@ -60,8 +71,9 @@ VAR
strings: strutils.strings; strings: strutils.strings;
parent, children: ARRAY ArrayMaxNumber OF CHAR; parent, children: ARRAY ArrayMaxNumber OF CHAR;
BEGIN BEGIN
FOR i := 0 TO LEN(self.TerminalKeys) - 1 DO
IF Strings.Match(key, self.TerminalKeys[i]) THEN COPY(self.TerminalsValues[i], returnValue); RETURN TRUE END; FOR i := 0 TO self.TerminalNumber DO
IF Strings.Match(key, self.TerminalKeys[i]) THEN COPY(self.TerminalValues[i], returnValue); RETURN TRUE END;
END; END;
strings := strutils.tokenize(key, '.'); strings := strutils.tokenize(key, '.');
@ -72,7 +84,7 @@ BEGIN
IF Strings.Length(parent) < 1 THEN RETURN FALSE END; IF Strings.Length(parent) < 1 THEN RETURN FALSE END;
noneTerminal := jsonRecord.GetNonTerminal(self, parent); noneTerminal := self.GetNonTerminal(self, parent);
IF noneTerminal = NIL THEN RETURN FALSE END; IF noneTerminal = NIL THEN RETURN FALSE END;
@ -92,11 +104,21 @@ PROCEDURE GetTerminalKeys(self : JsonTypePointer; VAR destination : ARRAY OF TSt
VAR VAR
i: LONGINT; i: LONGINT;
BEGIN BEGIN
FOR i := 0 TO LEN(self.TerminalKeys) - 1 DO FOR i := 0 TO self.TerminalNumber DO
COPY(self.TerminalKeys[i], destination[i]); COPY(self.TerminalKeys[i], destination[i]);
END; END;
END GetTerminalKeys; END GetTerminalKeys;
PROCEDURE GetTerminalValues(self : JsonTypePointer; VAR destination : ARRAY OF TString);
VAR
i: LONGINT;
BEGIN
FOR i := 0 TO LEN(self.TerminalValues) - 1 DO
Empty(destination[i]);
COPY(self.TerminalValues[i], destination[i]);
END;
END GetTerminalValues;
PROCEDURE GetNoneTerminalKeys(self : JsonTypePointer; VAR destination : ARRAY OF TString); PROCEDURE GetNoneTerminalKeys(self : JsonTypePointer; VAR destination : ARRAY OF TString);
VAR VAR
i: LONGINT; i: LONGINT;
@ -199,9 +221,12 @@ BEGIN
IF symbol = symbolBracketStart THEN IF symbol = symbolBracketStart THEN
(* Logger.Log("End Parsing Json"); *) (* Logger.Log("End Parsing Json"); *)
END; END;
symbol := text[i]; symbol := text[i];
(* Logger.LogIntLn(i); *)
(* IF i > 508 THEN
Logger.Log(text);
END; *)
(* terminals *) (* terminals *)
IF symbol = quote THEN IF symbol = quote THEN
i := PushDownString(text, quote, quote, i, string); i := PushDownString(text, quote, quote, i, string);
@ -219,7 +244,7 @@ BEGIN
IF (Strings.Length(key) > 0) & (Strings.Length(val) > 0) THEN IF (Strings.Length(key) > 0) & (Strings.Length(val) > 0) THEN
deQuote(key, self.TerminalKeys[terminalIterator]); deQuote(key, self.TerminalKeys[terminalIterator]);
deQuote(val, self.TerminalsValues[terminalIterator]); deQuote(val, self.TerminalValues[terminalIterator]);
INC(terminalIterator); INC(terminalIterator);
@ -252,7 +277,10 @@ BEGIN
INC(i); INC(i);
UNTIL (i >= LEN(text) - 1) OR (text[i] = 0X); UNTIL (i >= LEN(text) - 1) OR (text[i] = 0X);
self.NonTerminalNumber := noneTerminalIterator;
self.TerminalNumber := terminalIterator;
RETURN self; RETURN self;
END Create; END Create;

View file

@ -7,7 +7,7 @@ IMPORT
DependencyResolver, DependencyResolver,
Settings; Settings;
CONST CONST
MAXARRAYNUMBER = 10000; MAXARRAYNUMBER = 1000;
PROCEDURE install*; PROCEDURE install*;
VAR VAR
jsonData: ARRAY MAXARRAYNUMBER OF CHAR; jsonData: ARRAY MAXARRAYNUMBER OF CHAR;
@ -20,9 +20,9 @@ BEGIN
ASSERT(success); ASSERT(success);
Logger.Log("Starting resolving dependencies"); Logger.Log("Starting resolving dependencies");
Logger.Log(jsonData);
DependencyResolver.Resolve(jsonData); DependencyResolver.ResolveVersionFiles(jsonData);
DependencyResolver.ResolvePackages();
END install; END install;
BEGIN BEGIN

View file

@ -1,27 +1,14 @@
MODULE PackageResolver; MODULE PackageResolver;
IMPORT FileManager, http, Strings, Logger, Settings; IMPORT FileManager, http, Strings, Logger, Settings, JsonParser;
CONST ArrayMaxNumber = 10000; CONST ArrayMaxNumber = 1000;
PROCEDURE *Resolve(remoteURL, port, packageName, version : ARRAY OF CHAR); PROCEDURE ResolveFile *(host, port, path, packageName, version, fileName : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR);
BEGIN
END Resolve;
PROCEDURE ResolveFile *(host, port, packageName, version, fileName : ARRAY OF CHAR; VAR returnValue : ARRAY OF CHAR);
VAR VAR
filePath, localPath: ARRAY ArrayMaxNumber OF CHAR; localPath: ARRAY ArrayMaxNumber OF CHAR;
isSuccessfull: BOOLEAN; isSuccessfull: BOOLEAN;
BEGIN BEGIN
filePath := ""; http.get(host, port, path, returnValue);
Strings.Append("/", filePath);
Strings.Append(packageName, filePath);
Strings.Append("/", filePath);
Strings.Append(version, filePath);
Strings.Append("/", filePath);
Strings.Append(fileName, filePath);
http.get(host, port, filePath, returnValue);
http.getClean(returnValue, returnValue); http.getClean(returnValue, returnValue);
isSuccessfull := FileManager.CreateDirectory(packageName, Settings.installPath); isSuccessfull := FileManager.CreateDirectory(packageName, Settings.installPath);
@ -35,5 +22,16 @@ BEGIN
END ResolveFile; END ResolveFile;
PROCEDURE Resolve *(host, port, path, packageName, version: ARRAY OF CHAR; files: ARRAY OF JsonParser.TString);
VAR
i : LONGINT;
returnValue: JsonParser.TString;
BEGIN
FOR i := 0 TO LEN(files) - 1 DO
IF ~Strings.Match(files[i], "") THEN
ResolveFile(host, port, path, packageName, version, files[i], returnValue);
END;
END;
END Resolve;
END PackageResolver. END PackageResolver.

View file

@ -4,5 +4,5 @@ CONST
host* = "localhost"; host* = "localhost";
port* = "80"; port* = "80";
installPath* = "dependencies"; installPath* = "dependencies";
quote* = '"';
END Settings. END Settings.

View file

@ -1,18 +1,17 @@
{ {
'Package': 'Package-name', "Package": "Package-name",
'Author': 'Author Name', "Author": "Ruben",
'License':'License name', "License": "License name",
'Version': '1.0.0', "Version": "1.0.0",
'Remote': 'vishap.oberon.com', "Remote": "vishap.oberon.com",
'Port': '80', "Port": "80",
'Files': { "Files": {
'0': 'File1.Mod', "0": "File1.Mod",
'1': 'File2.Mod', "1": "File2.Mod",
'2': 'MakeFile' "2": "MakeFile"
}, },
'Dependencies': { "Dependencies": {
'dep1': '1.0.0', "lists": "1.0.0",
'dep2': '1.0.0' "diaspora": "1.0.0"
} }
} }

View file

@ -1,15 +0,0 @@
{
'Package': 'dep1',
'Author': 'Author Name',
'License':'License name',
'Version': '1.0.0',
'Remote': 'vishap.oberon.com',
'Port': '80',
'Files': {
'0': 'File1.Mod',
'1': 'File2.Mod',
'2': 'MakeFile'
},
'Dependencies': {
}
}

View file

@ -1,16 +0,0 @@
{
'Package': 'dep2',
'Author': 'Author Name',
'License':'License name',
'Version': '1.0.0',
'Remote': 'vishap.oberon.com',
'Port': '80',
'Files': {
'0': 'File1.Mod',
'1': 'File2.Mod',
'2': 'MakeFile'
},
'Dependencies': {
'dep1': '1.0.0'
}
}

View file

@ -1,8 +1,8 @@
MODULE http; MODULE http;
IMPORT Strings, Internet, Logger, Out; IMPORT Strings, Internet, Logger, Out;
CONST CONST
MAXARRAYNUMBER = 10000; MAXARRAYNUMBER = 1000;
MAXARRAYNUMBEREXTENDED = 1000000; MAXARRAYNUMBEREXTENDED = 10000;
TYPE TYPE
PSTRING = POINTER TO ARRAY OF CHAR; PSTRING = POINTER TO ARRAY OF CHAR;
@ -10,6 +10,14 @@ TYPE
VAR VAR
buff, buff2: ARRAY MAXARRAYNUMBEREXTENDED OF CHAR; buff, buff2: ARRAY MAXARRAYNUMBEREXTENDED OF CHAR;
PROCEDURE Empty *(VAR string: ARRAY OF CHAR);
VAR
i : LONGINT;
BEGIN
FOR i := 0 TO LEN(string) - 1 DO string[i] := 0X END;
COPY("", string);
END Empty;
PROCEDURE getClean *(buff: ARRAY OF CHAR; VAR clean: ARRAY OF CHAR); PROCEDURE getClean *(buff: ARRAY OF CHAR; VAR clean: ARRAY OF CHAR);
VAR VAR
i: INTEGER; i: INTEGER;
@ -56,7 +64,7 @@ PROCEDURE addHeader(key, val: ARRAY OF CHAR; VAR buff: PSTRING);
VAR VAR
header: ARRAY MAXARRAYNUMBER OF CHAR; header: ARRAY MAXARRAYNUMBER OF CHAR;
BEGIN BEGIN
COPY("", header); Empty(header);
Strings.Append(key, header); Strings.Append(key, header);
Strings.Append(": ", header); Strings.Append(": ", header);
Strings.Append(val, header); Strings.Append(val, header);
@ -88,7 +96,7 @@ VAR
endOfLine: ARRAY 3 OF CHAR; endOfLine: ARRAY 3 OF CHAR;
tmpBuff: ARRAY MAXARRAYNUMBER OF CHAR; tmpBuff: ARRAY MAXARRAYNUMBER OF CHAR;
BEGIN BEGIN
COPY("", buff); Empty( buff);
httpTail := " HTTP/1.1"; httpTail := " HTTP/1.1";
connectionFlag := Internet.Connect(host, port, socket); connectionFlag := Internet.Connect(host, port, socket);
@ -114,6 +122,8 @@ BEGIN
AppendEOLAndClean("", sendClean); AppendEOLAndClean("", sendClean);
connectionFlag := Internet.Write(socket, sendClean^); connectionFlag := Internet.Write(socket, sendClean^);
REPEAT REPEAT
Empty( tmpBuff);
connectionFlag := Internet.Read(socket, tmpBuff); connectionFlag := Internet.Read(socket, tmpBuff);
Strings.Append(tmpBuff, buff); Strings.Append(tmpBuff, buff);
getHeader(buff, "Content-Length", valueContentLengthString); getHeader(buff, "Content-Length", valueContentLengthString);