can be compiled, syncs tree. needs check for bugs.

This commit is contained in:
Norayr Chilingarian 2020-05-09 01:19:17 +04:00
parent 7a741b509a
commit 163102bd19
15 changed files with 264 additions and 216 deletions

View file

@ -1,105 +1,76 @@
MODULE vpkConf;
IMPORT Out, Files, Strings, Platform,
vpkFsHelper, vpkSettings;
vpkSettings, vpkEnv, vpkJsonParser;
VAR
conf, confDir : ARRAY 256 OF CHAR;
PROCEDURE getHome(VAR path: ARRAY OF CHAR);
BEGIN
IF ~(Platform.getEnv("HOME", path)) THEN
Out.String("HOME variable is not found"); Out.Ln;
HALT(1);
END;
END getHome;
CONST
open = '{"';
close = '"}';
is = '": "';
newkey = '", "';
PROCEDURE mkConfContent(VAR path: ARRAY OF CHAR);
(* constructing the line like:
{"path" : "https://github.com/vishaps/vipackTree"}, "type" : "git"}
*)
BEGIN
Strings.Append('{"path" : "', path);
Strings.Append(vpkSettings.treeURL, path);
Strings.Append('"}, "type" : "git"}', path);
COPY("", path);
Strings.Append(open, path);
Strings.Append(vpkSettings.confTreeKey, path);
Strings.Append(is, path);
Strings.Append(vpkSettings.defTreeVal, path);
Strings.Append(newkey, path);
Strings.Append(vpkSettings.confTypKey, path);
Strings.Append(is, path);
Strings.Append(vpkSettings.defTypVal, path);
Strings.Append(close, path);
END mkConfContent;
PROCEDURE makeFile(VAR confFilePath: ARRAY OF CHAR; VAR f: Files.File; VAR r: Files.Rider);
BEGIN
f := Files.New(confFilePath);
Files.Set(r, f, 0);
END makeFile;
PROCEDURE writeInFile(VAR f: Files.File; r: Files.Rider; VAR text : ARRAY OF CHAR);
BEGIN
Files.WriteBytes(r, text, Strings.Length(text));
END writeInFile;
PROCEDURE closeFile(VAR f: Files.File);
BEGIN
Files.Register(f);
Files.Close(f);
END closeFile;
PROCEDURE mkConfDirPath(home: ARRAY OF CHAR; VAR path: ARRAY OF CHAR);
BEGIN
confDir := home;
Strings.Append("/", path);
Strings.Append(vpkSettings.vpkConfDir, path);
END mkConfDirPath;
PROCEDURE setConfPath;
PROCEDURE mkDefConfig*;
VAR
home: ARRAY 128 OF CHAR;
content: ARRAY 96 OF CHAR;
f: Files.File;
r: Files.Rider;
BEGIN
getHome(home);
mkConfDirPath(home, confDir);
conf := confDir;
Strings.Append("/", conf);
Strings.Append(vpkSettings.vpkConfFile, conf);
END setConfPath;
PROCEDURE getConfPath*(VAR path: ARRAY OF CHAR);
BEGIN
COPY(conf, path);
END getConfPath;
PROCEDURE getConfDir*(VAR path: ARRAY OF CHAR);
BEGIN
COPY(confDir, path);
END getConfDir;
PROCEDURE configure*;
VAR
content: ARRAY 256 OF CHAR;
file : vpkFsHelper.fileInfo;
fd: Files.File;
rd: Files.Rider;
BEGIN
file.name := conf;
IF ~vpkFsHelper.Exists(file) THEN
(* Checking if ~/.vipack directory already exists *)
file.name := confDir;
IF ~vpkFsHelper.Exists(file) THEN (* exists!!! *)
Out.String("Creating directory "); Out.String(confDir);Out.Ln;
IF ~vpkFsHelper.mkDir(confDir) THEN
Out.String("failed to create "); Out.String(confDir); Out.String(" directory"); Out.Ln;
HALT(1);
END;
ELSE
IF ~(vpkFsHelper.dir IN file.attr) THEN
Out.String(confDir); Out.String(" exists, but is not a directory"); Out.Ln;
HALT(1);
END;
END;
(* create conf file *)
Out.String("Creating the configuration file "); Out.String(conf);Out.Ln;
content := "";
makeFile(conf, fd, rd);
vpkEnv.checkEnv;
f := vpkEnv.getConfFile();
Files.Set(r, f, 0);
mkConfContent(content);
writeInFile(fd, rd, content);
closeFile(fd);
ELSE
Out.String("File already exists");Out.Ln;
END;
END configure;
Files.WriteBytes(r, content, Strings.Length(content));
Files.Register(f);
Files.Close(f);
END mkDefConfig;
PROCEDURE configured*(): BOOLEAN;
BEGIN
setConfPath;
RETURN vpkEnv.checkConfig()
END configured;
PROCEDURE getConfigTreeVal*(VAR tree: vpkSettings.tree);
VAR
f: Files.File; r: Files.Rider;
dt: ARRAY 256 OF CHAR;
i : INTEGER; ch: CHAR;
jsonRecord : vpkJsonParser.JsonTypePointer;
b: BOOLEAN;
treeTyp: ARRAY 8 OF CHAR;
BEGIN
f := vpkEnv.getConfFile();
Files.Set(r, f, 0);
i := 0;
WHILE ~ r.eof & (i < LEN(dt)) DO Files.Read(r, ch); dt[i] := ch; INC(i) END;
Files.Close(f);
jsonRecord := vpkJsonParser.Create(dt);
b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.confTreeKey, tree.url);
IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.confTreeKey); Out.String(" from json"); Out.Ln; HALT(1); END;
b := vpkJsonParser.GetTerminal(jsonRecord, vpkSettings.confTypKey, treeTyp);
IF ~b THEN Out.String("unable to read "); Out.String (vpkSettings.confTypKey); Out.String(" from json"); Out.Ln; HALT(1); END;
IF treeTyp = vpkSettings.confTypGitVal THEN
tree.typ := vpkSettings.git;
ELSIF treeTyp = vpkSettings.confTypHttpVal THEN
tree.typ := vpkSettings.http
ELSE
tree.typ := vpkSettings.unkn;
END;
END getConfigTreeVal;
END vpkConf.