diff --git a/src/unix/vpkEnv.Mod b/src/unix/vpkEnv.Mod index 6d13b29..148514c 100644 --- a/src/unix/vpkEnv.Mod +++ b/src/unix/vpkEnv.Mod @@ -28,17 +28,19 @@ BEGIN END createIfNotThere; -PROCEDURE getSrcRelPath*(VAR depName, path0: ARRAY OF CHAR): strTypes.pstring; +PROCEDURE getSrcRelPath*(VAR depName, domain, path0: ARRAY OF CHAR): strTypes.pstring; VAR p: strTypes.pstring; len: INTEGER; BEGIN - len := 9 + Strings.Length(depName) + Strings.Length(path0); + len := 12 + Strings.Length(depName) + Strings.Length(path0) + Strings.Length(domain); (* 5 chars are ../, /, /, plus a couple of chars *) NEW(p, len); COPY("../", p^); Strings.Append(vpkSettings.vpkDepDir, p^); Strings.Append("/", p^); + Strings.Append(domain, p^); + Strings.Append("/", p^); Strings.Append(depName, p^); Strings.Append("/", p^); Strings.Append(path0, p^); @@ -87,7 +89,7 @@ BEGIN RETURN builddir END mkdefBldDir; -PROCEDURE mkdefPkgDirPath*(VAR name, path: ARRAY OF CHAR); +PROCEDURE mkdefPkgDirPath*(VAR domain, name, path: ARRAY OF CHAR); VAR home: ARRAY 128 OF CHAR; BEGIN @@ -100,18 +102,24 @@ BEGIN Strings.Append(vpkSettings.vpkDepDir, path); createIfNotThere(path); Strings.Append("/", path); + Strings.Append(domain, path); + createIfNotThere(path); + Strings.Append("/", path); Strings.Append(name, path); createIfNotThere(path); Strings.Append("/", path); END mkdefPkgDirPath; -PROCEDURE mkPkgDirPath*(VAR name, path: ARRAY OF CHAR); +PROCEDURE mkPkgDirPath*(VAR domain, name, path: ARRAY OF CHAR); BEGIN Strings.Append("/", path); createIfNotThere(path); Strings.Append(vpkSettings.vpkDepDir, path); Strings.Append("/", path); createIfNotThere(path); + Strings.Append(domain, path); + createIfNotThere(path); + Strings.Append("/", path); Strings.Append(name, path); createIfNotThere(path); Strings.Append("/", path); diff --git a/src/vpkInstaller.Mod b/src/vpkInstaller.Mod index e56bbc0..02d7108 100644 --- a/src/vpkInstaller.Mod +++ b/src/vpkInstaller.Mod @@ -39,12 +39,40 @@ 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); VAR depTree: vpkdepTree.TdepTree; dep: vpkdepTree.Tdep; i: LONGINT; - URI, branch: ARRAY 128 OF CHAR; + URI, branch, domain: ARRAY 128 OF CHAR; typ: ARRAY 16 OF CHAR; BEGIN depTree := resolve(package); @@ -53,7 +81,8 @@ BEGIN REPEAT dep := vpkdepTree.Get(depTree, i); vpkJsonDepRetriever.getURIandType(dep, URI, typ, branch); - vpkSyncer.fetch(dep.name^, URI, typ, prefix, branch); + extractDomainFromUrl(URI, domain); + vpkSyncer.fetch(dep.name^, URI, domain, typ, prefix, branch); INC(i) UNTIL i = depTree.Count; END fetch; @@ -63,7 +92,7 @@ VAR depTree: vpkdepTree.TdepTree; dep: vpkdepTree.Tdep; i, j: LONGINT; - URI, branch: ARRAY 128 OF CHAR; + URI, branch, domain: ARRAY 128 OF CHAR; typ: ARRAY 16 OF CHAR; keys, values: StringList.TStringList; k, v: StringList.pstring; @@ -82,7 +111,8 @@ BEGIN REPEAT dep := vpkdepTree.Get(depTree, i); vpkJsonDepRetriever.getURIandType(dep, URI, typ, branch); - vpkSyncer.fetch(dep.name^, URI, typ, prefix, branch); + extractDomainFromUrl(URI, domain); + vpkSyncer.fetch(dep.name^, URI, domain, typ, prefix, branch); b := FALSE; b := vpkJsonDepRetriever.getBuildInfo(dep, keys, values); IF b THEN @@ -90,7 +120,7 @@ BEGIN REPEAT k := keys.GetString(keys, j); v := values.GetString(values, j); - srcPath := vpkEnv.getSrcRelPath(dep.name^, v^); + srcPath := vpkEnv.getSrcRelPath(dep.name^, domain, v^); cmd := vpkEnv.mkCmd(k^, srcPath^); Out.String(cmd^); Out.Ln; res := Platform.Chdir(builddir^); @@ -107,4 +137,5 @@ BEGIN INC(i); UNTIL i = depTree.Count; END build; + END vpkInstaller. diff --git a/src/vpkSyncer.Mod b/src/vpkSyncer.Mod index f975d83..9967045 100644 --- a/src/vpkSyncer.Mod +++ b/src/vpkSyncer.Mod @@ -1,5 +1,6 @@ MODULE vpkSyncer; IMPORT Strings, Out, + strUtils, vpkSettings, vpkEnv, vpkConf, vpkGit; PROCEDURE mkTreePath(VAR path: ARRAY OF CHAR); @@ -22,15 +23,15 @@ BEGIN END; END sync; -PROCEDURE fetch*(name, url, typ, dst, branch: ARRAY OF CHAR); +PROCEDURE fetch*(name, url, dmn, typ, dst, branch: ARRAY OF CHAR); BEGIN IF dst = "" THEN - vpkEnv.mkdefPkgDirPath(name, dst); + vpkEnv.mkdefPkgDirPath(dmn, name, dst); ELSE - vpkEnv.mkPkgDirPath(name, dst); + vpkEnv.mkPkgDirPath(dmn, name, dst); END; - - IF typ = vpkSettings.rmtTypGitVal THEN + (* dst is changed by mkdefPkgDirPath and mkPkgdirPath *) + IF typ = vpkSettings.rmtTypGitVal THEN vpkGit.fetchRepo(url, dst, branch); ELSE Out.String("TODO: not a git url"); Out.Ln