diff --git a/GNUmakefile b/GNUmakefile index 14f78cd..2f182c2 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -18,6 +18,7 @@ endif all: get_deps build_deps buildThis get_deps: + @echo "getting deps" @for i in $(DEPEND); do \ if [ -d "$(DPS)/$${i}" ]; then \ cd "$(DPS)/$${i}"; \ @@ -31,8 +32,10 @@ get_deps: cd - ; \ fi; \ done + @echo "________________________________________" build_deps: + @echo "building deps" mkdir -p $(BLD) cd $(BLD); \ for i in $(DEPEND); do \ @@ -42,8 +45,11 @@ build_deps: make -f "$(DPS)/$${i}/Makefile" BUILD=$(BLD); \ fi; \ done + @echo "________________________________________" buildThis: + @echo "building vipack" + cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkTools.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkSettings.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkLinuxFiles.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkTime.Mod @@ -52,13 +58,14 @@ buildThis: cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/unix/vpkGit.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkStorage.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkConf.Mod - cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkSyncer.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkdepTree.Mod + cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkSyncer.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkDot.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkResolver.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkJsonDepRetriever.Mod cd $(BUILD) && $(VOC) -s $(mkfile_dir_path)/src/vpkInstaller.Mod cd $(BUILD) && $(VOC) $(mkfile_dir_path)/src/vipack.Mod -m + @echo "________________________________________" tests: #cd $(BUILD) && $(VOC) $(mkfile_dir_path)/test/testList.Mod -m diff --git a/src/unix/vpkEnv.Mod b/src/unix/vpkEnv.Mod index 148514c..35a77b5 100644 --- a/src/unix/vpkEnv.Mod +++ b/src/unix/vpkEnv.Mod @@ -54,7 +54,7 @@ BEGIN Strings.Append(vpkSettings.vpkConfDir, path); END mkConfDirPath; -PROCEDURE mkBldDir*(VAR prefix: ARRAY OF CHAR): strTypes.pstring; +PROCEDURE mkBldDir*(prefix: ARRAY OF CHAR): strTypes.pstring; VAR builddir: strTypes.pstring; ln : INTEGER; diff --git a/src/vipack.Mod b/src/vipack.Mod index 6a487eb..39ffa88 100644 --- a/src/vipack.Mod +++ b/src/vipack.Mod @@ -64,7 +64,7 @@ BEGIN HALT(3); END; Out.Ln; - + COPY("", package); COPY("", prefix); COPY("", tree); deps := FALSE; sync := FALSE; @@ -76,7 +76,7 @@ BEGIN fopt := opts.findOpt("-s", foptions); IF fopt # NIL THEN sync := TRUE END; - + opts.valOfOpt("-p", foptions, package); opts.valOfOpt("-P", foptions, prefix); opts.valOfOpt("-t", foptions, tree); @@ -94,7 +94,7 @@ PROCEDURE main; VAR deps, sync, fetch, ask: BOOLEAN; package, prefix, pkgTree: ARRAY 128 OF CHAR; - + options: opts.Options; foptions: opts.Options; opt, fopt: opts.Option; @@ -171,7 +171,7 @@ BEGIN HALT(3); END; Out.Ln; - + COPY("", package); COPY("", prefix); COPY("", pkgTree); deps := FALSE; sync := FALSE; @@ -192,7 +192,7 @@ BEGIN fopt := opts.findOpt("-s", foptions); IF fopt # NIL THEN sync := TRUE END; - + opts.valOfOpt("-p", foptions, package); opts.valOfOpt("-P", foptions, prefix); IF prefix = "" THEN @@ -226,20 +226,20 @@ END main; (* PROCEDURE help(); BEGIN - vpkLogger.Log("HelpText"); - Out.String("Vipack sync - syncing git tree and local tree"); Out.Ln; - Out.String("vipackConf.json path -> $HOME/.vipack/vipackConf.json"); Out.Ln; - Out.String("vipackTree path -> $HOME/.vipack/vipackTree") + vpkLogger.Log("HelpText"); + Out.String("Vipack sync - syncing git tree and local tree"); Out.Ln; + Out.String("vipackConf.json path -> $HOME/.vipack/vipackConf.json"); Out.Ln; + Out.String("vipackTree path -> $HOME/.vipack/vipackTree") END help; PROCEDURE main(); -VAR - S: Texts.Scanner; +VAR + S: Texts.Scanner; unit, command: ARRAY 64 OF CHAR; (* because Texts.Scanner.s is 64 bytes long*) BEGIN - (* this could go to vpkConf init section, + (* this could go to vpkConf init section, but here it is more visible. though may be it doesn't have to be *) - IF ~vpkConf.configured() THEN vpkConf.mkDefConfig END; + IF ~vpkConf.configured() THEN vpkConf.mkDefConfig END; (* Getting 1 argument and outputting it *) Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); @@ -248,18 +248,18 @@ BEGIN command := S.s; IF Strings.Match(command, "") OR Strings.Match(command, "help")THEN - help; - ELSE + help; + ELSE IF command = "sync" THEN vpkSyncer.sync; - END; + END; - IF command = "install" THEN - Texts.Scan(S); - unit := S.s; - vpkInstaller.install(unit); - END; + IF command = "install" THEN + Texts.Scan(S); + unit := S.s; + vpkInstaller.install(unit); + END; END; END main; diff --git a/src/vpkInstaller.Mod b/src/vpkInstaller.Mod index 574f1e0..69b8ccd 100644 --- a/src/vpkInstaller.Mod +++ b/src/vpkInstaller.Mod @@ -1,5 +1,8 @@ MODULE vpkInstaller; -IMPORT In, Out, StringList, vpkResolver, vpkdepTree, vpkDot, vpkEnv, vpkJsonDepRetriever, vpkSyncer, Platform; +IMPORT In, Out, Platform, + StringList, + vpkResolver, vpkdepTree, vpkDot, vpkEnv, vpkJsonDepRetriever,vpkSyncer, + vpkTools, vpkSettings; PROCEDURE resolve*(VAR unit: ARRAY OF CHAR): vpkdepTree.TdepTree; VAR @@ -39,70 +42,45 @@ BEGIN IF ch # 'y' THEN Out.Ln; Out.String('quitting'); Out.Ln; HALT(0); END END ask; -PROCEDURE extractDomainFromUrl(VAR url: ARRAY OF CHAR; VAR domain: ARRAY OF CHAR); -VAR - start, i, j: INTEGER; -BEGIN - start := 0; - (* Skip protocol to find the start of the domain *) - WHILE (start < LEN(url) - 1) & (url[start] # 0X) & ((url[start] # ':') OR (url[start+1] # '/')) DO - INC(start); - END; - - (* Skip the "://" part to actually reach the start of the domain *) - INC(start, 3); (* Assuming we stopped at ':', so we skip "://" *) - - i := start; - (* Now 'start' is at the beginning of the domain, find the end of the domain *) - WHILE (i < LEN(url)) & (url[i] # 0X) & (url[i] # '/') DO - INC(i); - END; - - (* Copy domain from url *) - j := 0; - WHILE (start < i) & (j < LEN(domain) - 1) DO - domain[j] := url[start]; - INC(j); INC(start); - END; - domain[j] := 0X; (* Ensure the domain string is null-terminated *) -END extractDomainFromUrl; - -PROCEDURE fetch*(VAR package, prefix, pkgTree: ARRAY OF CHAR; a: BOOLEAN); +PROCEDURE fetch*(VAR package:ARRAY OF CHAR; prefix: ARRAY OF CHAR; VAR pkgTree: ARRAY OF CHAR; a: BOOLEAN); VAR depTree: vpkdepTree.TdepTree; dep: vpkdepTree.Tdep; i: LONGINT; - URI, branch, domain: ARRAY 128 OF CHAR; - typ: ARRAY 16 OF CHAR; BEGIN + Out.String("entered vpkInstaller.fetch, prefix="); Out.String(prefix); Out.Ln; depTree := resolve(package); IF a THEN ask END; i := 0; REPEAT dep := vpkdepTree.Get(depTree, i); - vpkJsonDepRetriever.getURIandType(dep, URI, typ, branch); - extractDomainFromUrl(URI, domain); - vpkSyncer.fetch(dep.name^, URI, domain, typ, prefix, branch); + vpkJsonDepRetriever.getURIandType(dep); + Out.String("vpkInstaller.fetch, repeat bfr vpkSyncer.fetch, prefix="); + Out.String(prefix); Out.Ln; + vpkSyncer.fetch(dep, prefix); + Out.String("vpkInstaller.fetch, repeat aftr vpkSyncer.fetch, prefix="); + Out.String(prefix); Out.Ln; INC(i) UNTIL i = depTree.Count; END fetch; -PROCEDURE build*(VAR package, prefix, tree: ARRAY OF CHAR; a : BOOLEAN); +PROCEDURE build*(VAR package: ARRAY OF CHAR; prefix: ARRAY OF CHAR; VAR tree: ARRAY OF CHAR; a : BOOLEAN); VAR depTree: vpkdepTree.TdepTree; dep: vpkdepTree.Tdep; - i, j: LONGINT; - URI, branch, domain: ARRAY 128 OF CHAR; - typ: ARRAY 16 OF CHAR; + i, j: LONGINT; keys, values: StringList.TStringList; k, v: StringList.pstring; b: BOOLEAN; builddir, cmd, srcPath: StringList.pstring; res: INTEGER; + domain: ARRAY 256 OF CHAR; BEGIN + Out.String("entered vpkInstaller.build, prefix="); Out.String(prefix); Out.Ln; IF prefix # "" THEN builddir := vpkEnv.mkBldDir(prefix) ELSE + Out.String("calling vpkEnv.mkdefBldDir"); Out.Ln; builddir := vpkEnv.mkdefBldDir(); END; depTree := resolve(package); @@ -110,16 +88,22 @@ BEGIN i := 0; REPEAT dep := vpkdepTree.Get(depTree, i); - vpkJsonDepRetriever.getURIandType(dep, URI, typ, branch); + vpkJsonDepRetriever.getURIandType(dep); Out.String("aftergetURIandType"); Out.Ln; - Out.String("got uri: "); Out.String(URI); Out.Ln; - Out.String("got type: "); Out.String(typ); Out.Ln; - extractDomainFromUrl(URI, domain); - Out.String("extracted domain; "); Out.String(domain); Out.Ln; - vpkSyncer.fetch(dep.name^, URI, domain, typ, prefix, branch); + Out.String("got uri: "); Out.String(dep^.rmt^.URI); Out.Ln; + Out.String("got type: "); + IF dep^.Type = vpkSettings.git THEN Out.String("git"); + ELSIF dep^.Type = vpkSettings.https THEN Out.String("https") END; + Out.Ln; + Out.String("vpkInstaller.build, repeat bfr vpkSyncer.fetch, prefix="); + Out.String(prefix); Out.Ln; + vpkSyncer.fetch(dep, prefix); + Out.String("vpkInstaller.build, repeat bfr vpkSyncer.fetch, prefix="); + Out.String(prefix); Out.Ln; b := FALSE; b := vpkJsonDepRetriever.getBuildInfo(dep, keys, values); IF b THEN + vpkTools.extractDomainFromUrl(dep^.rmt.URI, domain); j := 0; REPEAT k := keys.GetString(keys, j); diff --git a/src/vpkJsonDepRetriever.Mod b/src/vpkJsonDepRetriever.Mod index 4f7fa5d..2325e19 100644 --- a/src/vpkJsonDepRetriever.Mod +++ b/src/vpkJsonDepRetriever.Mod @@ -70,7 +70,7 @@ BEGIN RETURN b; END getBuildInfo; -PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep; VAR URI: ARRAY OF CHAR; VAR type: ARRAY OF CHAR; VAR branch: ARRAY OF CHAR); +PROCEDURE getURIandType*(VAR d: vpkdepTree.Tdep); VAR jsonstr, errstr: strUtils.pstring; tree, singleValue, remoteValue: Json.Value; @@ -83,10 +83,8 @@ VAR url, urlStr, authType, authTypeStr, md5, md5Str, authCr, authCrStr, user, userStr, password, passwordStr: Json.jString; + httpsRemote: vpkdepTree.RemoteHttps; gitRemote: vpkdepTree.RemoteGit; BEGIN - strUtils.zeroStr(URI); - strUtils.zeroStr(type); - strUtils.zeroStr(branch); jsonstr := NIL; vpkStorage.json2pstring(d.name^, jsonstr); IF jsonstr # NIL THEN @@ -122,10 +120,9 @@ BEGIN IF someObj.value IS Json.Str THEN val := someObj.value(Json.Str).str; IF key^ = vpkSettings.rmtTypKey THEN (* type *) - COPY(val^, type); - Out.String("type found: "); Out.String(type); Out.Ln; IF val^ = vpkSettings.rmtTypHttpsVal THEN - + NEW(httpsRemote); d^.rmt := httpsRemote; + d^.Type := vpkSettings.https; WHILE singleValue # NIL DO someObj := singleValue(Json.Obj); @@ -199,16 +196,20 @@ BEGIN ELSIF val^ = vpkSettings.rmtTypGitVal THEN + NEW(gitRemote); d^.rmt := gitRemote; + d^.Type := vpkSettings.git; WHILE singleValue # NIL DO IF singleValue IS Json.Obj THEN someObj := singleValue(Json.Obj); key := someObj.name; Out.String("git key: "); Out.String(key^); Out.Ln; val := someObj.value(Json.Str).str; - IF key^ = vpkSettings.rmtTreeBranchKey THEN COPY(val^, branch) END; + IF key^ = vpkSettings.rmtTreeBranchKey THEN + COPY(val^, d^.rmt(vpkdepTree.RemoteGit)^.branch); + END; IF key^ = vpkSettings.rmtTreeKey THEN - COPY(val^, URI); - Out.String("uri found: "); Out.String(URI); Out.Ln; + COPY(val^, d^.rmt^.URI); + Out.String("uri found: "); Out.String(d^.rmt^.URI); Out.Ln; END; END; singleValue := someObj.next; diff --git a/src/vpkSettings.Mod b/src/vpkSettings.Mod index f21cdb9..cbb43ab 100644 --- a/src/vpkSettings.Mod +++ b/src/vpkSettings.Mod @@ -1,10 +1,11 @@ MODULE vpkSettings; IMPORT Platform, Out; CONST - http* = 0; - https* = 1; - gemini* = 2; - git* = 3; + (* remotes *) + http* = 0; httpWithAuth* = 1; + https* = 2; httpsWithAuth* = 3; + gemini* = 4; + git* = 5; unkn* = -1; VAR diff --git a/src/vpkSyncer.Mod b/src/vpkSyncer.Mod index 9967045..492029b 100644 --- a/src/vpkSyncer.Mod +++ b/src/vpkSyncer.Mod @@ -1,7 +1,7 @@ MODULE vpkSyncer; IMPORT Strings, Out, strUtils, - vpkSettings, vpkEnv, vpkConf, vpkGit; + vpkSettings, vpkEnv, vpkConf, vpkGit, vpkdepTree, vpkTools; PROCEDURE mkTreePath(VAR path: ARRAY OF CHAR); BEGIN @@ -23,19 +23,30 @@ BEGIN END; END sync; -PROCEDURE fetch*(name, url, dmn, typ, dst, branch: ARRAY OF CHAR); +PROCEDURE fetch*(VAR dep: vpkdepTree.Tdep; dst: ARRAY OF CHAR); +VAR domain: ARRAY 64 OF CHAR; BEGIN + vpkTools.extractDomainFromUrl(dep^.rmt^.URI, domain); + Out.String("vpkSyncer.fetch, dst="); Out.String(dst); Out.Ln; IF dst = "" THEN - vpkEnv.mkdefPkgDirPath(dmn, name, dst); + vpkEnv.mkdefPkgDirPath(domain, dep^.name^, dst); ELSE - vpkEnv.mkPkgDirPath(dmn, name, dst); + vpkEnv.mkPkgDirPath(domain, dep^.name^, dst); END; + Out.String("now vpkSyncer.fetch, dst="); Out.String(dst); Out.Ln; (* dst is changed by mkdefPkgDirPath and mkPkgdirPath *) - IF typ = vpkSettings.rmtTypGitVal THEN - vpkGit.fetchRepo(url, dst, branch); + (*IF dep^.Type = vpkSettings.git THEN*) + IF dep^.rmt # NIL THEN + IF dep^.rmt IS vpkdepTree.RemoteGit THEN + Out.String("in vkpSyncer.fetch uri is "); Out.String(dep^.rmt^.URI); Out.Ln; + vpkGit.fetchRepo(dep^.rmt^.URI, dst, dep^.rmt(vpkdepTree.RemoteGit).branch); + ELSE + Out.String("TODO: not a git url"); Out.Ln + END ELSE - Out.String("TODO: not a git url"); Out.Ln - END + Out.String("deps remote is not set, this should not happen"); Out.Ln; + HALT(5); + END; END fetch; END vpkSyncer. diff --git a/src/vpkTools.Mod b/src/vpkTools.Mod new file mode 100644 index 0000000..711ee1f --- /dev/null +++ b/src/vpkTools.Mod @@ -0,0 +1,32 @@ +MODULE vpkTools; + +PROCEDURE extractDomainFromUrl*(VAR url: ARRAY OF CHAR; VAR domain: ARRAY OF CHAR); +VAR + start, i, j: INTEGER; +BEGIN + start := 0; + (* Skip protocol to find the start of the domain *) + WHILE (start < LEN(url) - 1) & (url[start] # 0X) & ((url[start] # ':') OR (url[start+1] # '/')) DO + INC(start); + END; + + (* Skip the "://" part to actually reach the start of the domain *) + INC(start, 3); (* Assuming we stopped at ':', so we skip "://" *) + + i := start; + (* Now 'start' is at the beginning of the domain, find the end of the domain *) + WHILE (i < LEN(url)) & (url[i] # 0X) & (url[i] # '/') DO + INC(i); + END; + + (* Copy domain from url *) + j := 0; + WHILE (start < i) & (j < LEN(domain) - 1) DO + domain[j] := url[start]; + INC(j); INC(start); + END; + domain[j] := 0X; (* Ensure the domain string is null-terminated *) +END extractDomainFromUrl; + + +END vpkTools. diff --git a/src/vpkdepTree.Mod b/src/vpkdepTree.Mod index 04f748c..4942f01 100644 --- a/src/vpkdepTree.Mod +++ b/src/vpkdepTree.Mod @@ -2,6 +2,9 @@ MODULE vpkdepTree; IMPORT Out, Strings, strUtils, List, StringList, vpkSettings; + + + TYPE pstring = strUtils.pstring; @@ -27,19 +30,36 @@ TYPE retriever- = PROCEDURE (VAR d: Tdep; VAR strlist: StringList.TStringList): LONGINT; - (* to be added to Tdep? - bldSeq* = POINTER TO bldSeqDesc; - bldSeqDesc* = RECORD - cmd*, file*: StringList.TStringList; + Remote* = POINTER TO RemoteDesc; + RemoteDesc* = RECORD + URI* : ARRAY 512 OF CHAR; END; - file* = POINTER to fileDesc; - fileDesc* = RECORD - url*, authType*, MD5*: ARRAY 512 OF CHAR; - authUsr*, authPwd*: ARRAY 64 OF CHAR; + RemoteGit* = POINTER TO RemoteGitDesc; + RemoteGitDesc* = RECORD(RemoteDesc) + hash* : ARRAY 64 OF CHAR; + branch* : ARRAY 32 OF CHAR; + tag* : ARRAY 16 OF CHAR; END; - files* = List.TList; -*) + + RemoteHttp* = POINTER TO RemoteHttpDesc; + RemoteHttpDesc* = RECORD(RemoteDesc) + HttpAuth* : BOOLEAN; + files* : StringList.TStringList; + usernames* : StringList.TStringList; + passwords* : StringList.TStringList; + hashes* : StringList.TStringList; + END; + + RemoteHttps* = POINTER TO RemoteHttpDesc; + RemoteHttpsDesc* = RECORD(RemoteDesc) + HttpAuth* : BOOLEAN; + files* : StringList.TStringList; + usernames* : StringList.TStringList; + passwords* : StringList.TStringList; + hashes* : StringList.TStringList; + END; + TdepDesc* = RECORD prev-, next-: Tdep; name- : pstring; @@ -49,12 +69,8 @@ TYPE RetrieveDeps- : retriever; InstallRetriever*: PROCEDURE(VAR d: Tdep; r: retriever); - Type* : LONGINT; (* from vpkSettings http=0, https=1, gemini=2, git=3 *) - (* - gitPath* : ARRAY 256 OF CHAR; - gitTag* : ARRAY 64 OF CHAR; - bldSequence*: bldSeq;: -*) + Type* : LONGINT; (* from vpkSettings: http, https, gemini, git... *) + rmt* : Remote; END; PROCEDURE AssignDeps*(VAR d: Tdep; VAR deps: Tdeps); @@ -77,6 +93,7 @@ BEGIN dep.AssignDeps := AssignDeps; dep.InstallRetriever := InstallRetriever; dep.RetrieveDeps := NIL; + dep.rmt := NIL; RETURN dep END CreateDep;