Skip to content

Commit

Permalink
Separate packageinfo.* files for dealing with PackageInfo files
Browse files Browse the repository at this point in the history
  • Loading branch information
mtorpey committed Sep 4, 2024
1 parent 2c611ca commit 9155c70
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 114 deletions.
18 changes: 0 additions & 18 deletions gap/PackageManager.gd
Original file line number Diff line number Diff line change
Expand Up @@ -122,16 +122,6 @@ DeclareGlobalFunction("UpdatePackage");
DeclareInfoClass("InfoPackageManager");
SetInfoLevel(InfoPackageManager, 3);

#! @Description
#! Attempts to download and install a package from a valid `PackageInfo.g`
#! file. The argument <A>info</A> should be either a valid package info
#! record, or a URL that points to a valid `PackageInfo.g` file. Returns
#! <K>true</K> if the installation was successful, and <K>false</K> otherwise.
#! @Arguments info
#! @Returns
#! <K>true</K> or <K>false</K>
DeclareGlobalFunction("InstallPackageFromInfo");

#! @Section Removing packages

#! @Description
Expand Down Expand Up @@ -160,12 +150,4 @@ DeclareGlobalFunction("RemovePackage");
# Hidden functions
DeclareGlobalFunction("PKGMAN_CheckPackage");
DeclareGlobalFunction("PKGMAN_Exec");
DeclareGlobalFunction("PKGMAN_RefreshPackageInfo");
DeclareGlobalFunction("PKGMAN_ValidatePackageInfo");
DeclareGlobalFunction("PKGMAN_InfoWithIndent");

# PackageInfo must at least contain the following to pass:
PKGMAN_RequiredPackageInfoFields := ["PackageName",
"PackageDoc",
"Version",
"Date"];
78 changes: 0 additions & 78 deletions gap/PackageManager.gi
Original file line number Diff line number Diff line change
Expand Up @@ -67,69 +67,6 @@ function(string, args...)
return InstallPackageFromName(string, version, interactive);
end);

InstallGlobalFunction(InstallPackageFromInfo,
function(info, version...)
local formats, format, url;

# Check input
if not (IsString(info) or IsRecord(info)) then
ErrorNoReturn("PackageManager: InstallPackageFromInfo: ",
"<info> should be a rec or URL");
fi;

# Get file from URL
if IsString(info) then
info := PKGMAN_DownloadPackageInfo(info);
if info = fail then
return false;
fi;
fi;

# Check the version condition.
if Length(version) = 1 and IsString(version[1])
and not CompareVersionNumbers(info.Version, version[1]) then
Info(InfoPackageManager, 1, "Version \"", version[1], "\" of package \"",
info.PackageName, "\" cannot be satisfied");
Info(InfoPackageManager, 2,
"The newest version available is ", info.Version);
return false;
fi;

# Read the information we want from it
formats := SplitString(info.ArchiveFormats, "", ", \n\r\t");
format := First(PKGMAN_ArchiveFormats, f -> f in formats);
if format = fail then
Info(InfoPackageManager, 1,
"No supported archive formats available, so could not install");
Info(InfoPackageManager, 1, "Only ", formats, " available");
return false;
fi;
url := Concatenation(info.ArchiveURL, format);

# Download the archive
return InstallPackageFromArchive(url);
end);

BindGlobal("PKGMAN_GetPackageInfo",
function(dir_or_stream)
local fname, info;
if IsString(dir_or_stream) or IsDirectory(dir_or_stream) then
fname := Filename(Directory(dir_or_stream), "PackageInfo.g");
if not IsReadableFile(fname) then
Info(InfoPackageManager, 1, "Could not find PackageInfo.g file");
return fail;
fi;
Read(fname);
GAPInfo.PackageInfoCurrent.InstallationPath := fname;
elif IsInputStream(dir_or_stream) then
info := dir_or_stream;
Read(info);
else
Error("invalid input");
fi;
return GAPInfo.PackageInfoCurrent;
end);

InstallGlobalFunction(RemovePackage,
function(name, interactive...)
local user_pkg_dir, allinfo, info, dir;
Expand Down Expand Up @@ -423,21 +360,6 @@ function(dir, cmd, args...)
return rec(code := code, output := out);
end);

InstallGlobalFunction(PKGMAN_RefreshPackageInfo,
function()
GAPInfo.PackagesInfoInitialized := false;
InitializePackagesInfoRecords();
Info(InfoPackageManager, 4, "Reloaded all package info records");
end);

InstallGlobalFunction(PKGMAN_ValidatePackageInfo,
function(info)
local quiet;
# Suppress output unless info level is maximum
quiet := InfoLevel(InfoPackageManager) < 4;
return ValidatePackageInfo(info : quiet := quiet);
end);

InstallGlobalFunction(PKGMAN_InfoWithIndent,
function(infoLevel, message, indentLevel)
local indent, line;
Expand Down
19 changes: 19 additions & 0 deletions gap/packageinfo.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#! @Description
#! Attempts to download and install a package from a valid `PackageInfo.g`
#! file. The argument <A>info</A> should be either a valid package info
#! record, or a URL that points to a valid `PackageInfo.g` file. Returns
#! <K>true</K> if the installation was successful, and <K>false</K> otherwise.
#! @Arguments info
#! @Returns
#! <K>true</K> or <K>false</K>
DeclareGlobalFunction("InstallPackageFromInfo");

DeclareGlobalFunction("PKGMAN_GetPackageInfo");
DeclareGlobalFunction("PKGMAN_RefreshPackageInfo");
DeclareGlobalFunction("PKGMAN_ValidatePackageInfo");

# PackageInfo files must at least contain the following:
PKGMAN_RequiredPackageInfoFields := ["PackageName",
"PackageDoc",
"Version",
"Date"];
77 changes: 77 additions & 0 deletions gap/packageinfo.gi
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
InstallGlobalFunction(InstallPackageFromInfo,
function(info, version...)
local formats, format, url;

# Check input
if not (IsString(info) or IsRecord(info)) then
ErrorNoReturn("PackageManager: InstallPackageFromInfo: ",
"<info> should be a rec or URL");
fi;

# Get file from URL
if IsString(info) then
info := PKGMAN_DownloadPackageInfo(info);
if info = fail then
return false;
fi;
fi;

# Check the version condition.
if Length(version) = 1 and IsString(version[1])
and not CompareVersionNumbers(info.Version, version[1]) then
Info(InfoPackageManager, 1, "Version \"", version[1], "\" of package \"",
info.PackageName, "\" cannot be satisfied");
Info(InfoPackageManager, 2,
"The newest version available is ", info.Version);
return false;
fi;

# Read the information we want from it
formats := SplitString(info.ArchiveFormats, "", ", \n\r\t");
format := First(PKGMAN_ArchiveFormats, f -> f in formats);
if format = fail then
Info(InfoPackageManager, 1,
"No supported archive formats available, so could not install");
Info(InfoPackageManager, 1, "Only ", formats, " available");
return false;
fi;
url := Concatenation(info.ArchiveURL, format);

# Download the archive
return InstallPackageFromArchive(url);
end);

InstallGlobalFunction(PKGMAN_GetPackageInfo,
function(dir_or_stream)
local fname, info;
if IsString(dir_or_stream) or IsDirectory(dir_or_stream) then
fname := Filename(Directory(dir_or_stream), "PackageInfo.g");
if not IsReadableFile(fname) then
Info(InfoPackageManager, 1, "Could not find PackageInfo.g file");
return fail;
fi;
Read(fname);
GAPInfo.PackageInfoCurrent.InstallationPath := fname;
elif IsInputStream(dir_or_stream) then
info := dir_or_stream;
Read(info);
else
Error("invalid input");
fi;
return GAPInfo.PackageInfoCurrent;
end);

InstallGlobalFunction(PKGMAN_RefreshPackageInfo,
function()
GAPInfo.PackagesInfoInitialized := false;
InitializePackagesInfoRecords();
Info(InfoPackageManager, 4, "Reloaded all package info records");
end);

InstallGlobalFunction(PKGMAN_ValidatePackageInfo,
function(info)
local quiet;
# Suppress output unless info level is maximum
quiet := InfoLevel(InfoPackageManager) < 4;
return ValidatePackageInfo(info : quiet := quiet);
end);
1 change: 1 addition & 0 deletions init.g
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ ReadPackage("PackageManager", "gap/download.gd");
ReadPackage("PackageManager", "gap/git.gd");
ReadPackage("PackageManager", "gap/hg.gd");
ReadPackage("PackageManager", "gap/interactive.gd");
ReadPackage("PackageManager", "gap/packageinfo.gd");
1 change: 1 addition & 0 deletions read.g
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ ReadPackage("PackageManager", "gap/download.gi");
ReadPackage("PackageManager", "gap/git.gi");
ReadPackage("PackageManager", "gap/hg.gi");
ReadPackage("PackageManager", "gap/interactive.gi");
ReadPackage("PackageManager", "gap/packageinfo.gi");
18 changes: 0 additions & 18 deletions tst/PackageManager.tst
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,6 @@ gap> UpdatePackage("GAPDoc", false);
#I Package "gapdoc" not installed in user package directory
false

# Install a package from a PackageInfo.g URL (includes redirect)
gap> InstallPackage("https://gap-packages.github.io/autpgrp/PackageInfo.g");
true
gap> ForAny(DirectoryContents(PKGMAN_PackageDir()),
> f -> StartsWith(f, "autpgrp"));
true
gap> RemovePackage("autpgrp", false);
true

# RemovePackage failure
gap> RemovePackage(3);
Error, PackageManager: RemovePackage: <name> must be a string
Expand Down Expand Up @@ -62,15 +53,6 @@ if specified, <interactive> must be true or false
gap> InstallPackage("semigroups", ">=3.0", true, "i dont know");
Error, PackageManager: InstallPackage: requires 1 to 3 arguments (not 4)

# InstallPackageFromInfo input failure
gap> InstallPackageFromInfo(42);
Error, PackageManager: InstallPackageFromInfo: <info> should be a rec or URL

# InstallPackageFromInfo failure
gap> InstallPackage("http://www.nothing.rubbish/PackageInfo.g");
#I Unable to download from http://www.nothing.rubbish/PackageInfo.g
false

# Check a bad package directory
gap> baddir := Filename(Directory(PKGMAN_PackageDir()), "badpkg");;
gap> CreateDir(baddir);;
Expand Down
17 changes: 17 additions & 0 deletions tst/packageinfo.tst
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Install a package from a PackageInfo.g URL (includes redirect)
gap> InstallPackage("https://gap-packages.github.io/autpgrp/PackageInfo.g");
true
gap> ForAny(DirectoryContents(PKGMAN_PackageDir()),
> f -> StartsWith(f, "autpgrp"));
true
gap> RemovePackage("autpgrp", false);
true

# InstallPackageFromInfo input failure
gap> InstallPackageFromInfo(42);
Error, PackageManager: InstallPackageFromInfo: <info> should be a rec or URL

# InstallPackageFromInfo failure
gap> InstallPackage("http://www.nothing.rubbish/PackageInfo.g");
#I Unable to download from http://www.nothing.rubbish/PackageInfo.g
false

0 comments on commit 9155c70

Please sign in to comment.