Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions lib/package.gi
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ InstallGlobalFunction( InitializePackagesInfoRecords, function( arg )
# the first time this is called, add the cmd line args to the list
if IsEmpty(GAPInfo.PackageDirectories) then
for pkgdirstrs in GAPInfo.CommandLineOptions.packagedirs do
pkgdirs:= List( SplitString( pkgdirstrs, ";" ), Directory );
pkgdirs:= List( List( SplitString( pkgdirstrs, ";" ), GAP_realpath ), Directory );
for pkgdir in pkgdirs do
if not pkgdir in GAPInfo.PackageDirectories then
Add( GAPInfo.PackageDirectories, pkgdir );
Expand Down Expand Up @@ -1864,6 +1864,7 @@ InstallGlobalFunction( SetPackagePath, function( pkgname, pkgpath )
InstallGlobalFunction( ExtendRootDirectories, function( rootpaths )
local i;

rootpaths:= List( rootpaths, GAP_realpath );
rootpaths:= Filtered( rootpaths, path -> not path in GAPInfo.RootPaths );
if not IsEmpty( rootpaths ) then
# 'DirectoriesLibrary' concatenates root paths with directory names.
Expand Down Expand Up @@ -1896,8 +1897,10 @@ InstallGlobalFunction( ExtendPackageDirectories, function( paths_or_dirs )
changed:= false;
for p in paths_or_dirs do
if IsString( p ) then
p:= Directory( p );
elif not IsDirectory( p ) then
p:= Directory( GAP_realpath ( p ) );
elif IsDirectory( p ) then
p:= Directory( GAP_realpath ( p![1] ) );
else
Error("input must be a list of path strings or directory objects");
fi;
if not p in GAPInfo.PackageDirectories then
Expand Down
17 changes: 16 additions & 1 deletion src/sysroots.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "sysstr.h"
#include "system.h"

#include <limits.h>
#include <stdlib.h>


Expand Down Expand Up @@ -197,14 +198,28 @@ void SySetGapRootPath(const Char * string)
return;
const UInt userhomelen = strlen(userhome);
for (i = 0; i < MAX_GAP_DIRS && SyGapRootPaths[i][0]; i++) {
const UInt pathlen = strlen(SyGapRootPaths[i]);
UInt pathlen = strlen(SyGapRootPaths[i]);
if (SyGapRootPaths[i][0] == '~' &&
userhomelen + pathlen < sizeof(SyGapRootPaths[i])) {
SyMemmove(SyGapRootPaths[i] + userhomelen,
// don't copy the ~ but the trailing '\0'
SyGapRootPaths[i] + 1, pathlen);
memcpy(SyGapRootPaths[i], userhome, userhomelen);
}

// convert all paths to absolute paths
char tempstr[PATH_MAX];

if (NULL == realpath(SyGapRootPaths[i], tempstr)) {
SySetErrorNo();
} else {
strxcpy(SyGapRootPaths[i], tempstr, sizeof(SyGapRootPaths[i]));
pathlen = strlen(SyGapRootPaths[i]);
if (SyGapRootPaths[i][pathlen - 1] != '/') {
SyGapRootPaths[i][pathlen] = '/';
SyGapRootPaths[i][pathlen + 1] = '\0';
}
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/sysroots.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ void SySetGapRootPath(const Char * string);
**
** <buf> must point to a buffer of at least <size> characters. This function
** then searches for a readable file with the name <filename> in the system
** area. If sich a file is found then its absolute path is copied into
** area. If such a file is found then its absolute path is copied into
** <buf>, and <buf> is returned. If no file is found or if <buf> is not big
** enough, then <buf> is set to an empty string and NULL is returned.
*/
Expand Down