aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordacctal <dacctal@symlinx.net>2026-06-11 22:13:16 +0000
committerdacctal <dacctal@symlinx.net>2026-06-11 22:13:16 +0000
commitf81a7ccdff682acc7a7ec2e6c4dced9bcfde4387 (patch)
tree16c864f5ffe306a661dd37a68f54d184635ed459
parentd057a68a837d278f5dfe55a5dc3c4998e4f126f5 (diff)
IT WORKSindev
-rw-r--r--src/create_pkg.c42
-rw-r--r--src/files.c93
-rw-r--r--src/install_pkg.c7
-rw-r--r--src/lua_state.c4
-rw-r--r--src/remove_pkg.c2
5 files changed, 82 insertions, 66 deletions
diff --git a/src/create_pkg.c b/src/create_pkg.c
index cf92f75..cfb388f 100644
--- a/src/create_pkg.c
+++ b/src/create_pkg.c
@@ -43,13 +43,28 @@ Pkg create_pkg(const char *arg) {
}
}
+ cache_install_directories();
+ bool is_installed_locally = false;
+ char dest_dir[MAX_PATH_LEN];
+ if (new_arg[0] == '.') {
+ char cwd[MAX_PATH_LEN];
+ getcwd(cwd, MAX_PATH_LEN);
+ snprintf(dest_dir, sizeof(dest_dir), "%s/%s",
+ get_install_dir("src"), name_from_url(cwd));
+ } else {
+ snprintf(dest_dir, sizeof(dest_dir), "%s/%s",
+ get_install_dir("src"), new_arg);
+ }
+ if (is_directory(dest_dir)) is_installed_locally = true;
+
if (strncmp(new_arg, "http", 4) == 0) {
pkg.url = strdup(new_arg);
pkg.name = name_from_url(new_arg);
} else if (strcmp(new_arg, ".") == 0) {
pkg.url = "";
- getcwd(pkg.src, MAX_PATH_LEN);
- pkg.name = name_from_url(pkg.src);
+ char cwd[MAX_PATH_LEN];
+ getcwd(cwd, MAX_PATH_LEN);
+ pkg.name = name_from_url(cwd);
pkg.is_local = true;
} else if (is_in_repos) {
for (size_t i = 0; i < cached_repos_count; i++) {
@@ -59,6 +74,10 @@ Pkg create_pkg(const char *arg) {
}
}
pkg.name = strdup(new_arg);
+ } else if (is_installed_locally) {
+ pkg.url = "";
+ pkg.name = name_from_url(dest_dir);
+ pkg.is_local = true;
} else {
printf("%s '%s' is not a valid package\n", print_error, new_arg);
exit(EXIT_FAILURE);
@@ -68,20 +87,15 @@ Pkg create_pkg(const char *arg) {
strncmp(pkg.name + strlen(pkg.name) - 4, ".git", 4) == 0)
pkg.name[strlen(pkg.name) - 4] = '\0';
- cache_install_directories();
- if (!pkg.is_local) {
- char src_dir[MAX_PATH_LEN];
- snprintf(src_dir, sizeof(src_dir), "%s/%s/%s",
- get_install_dir("src"), pkg.name, pkg.ver);
- snprintf(pkg.src, MAX_PATH_LEN, "%s", src_dir);
+ char src_dir[MAX_PATH_LEN];
+ if (pkg.is_local) {
+ snprintf(src_dir, sizeof(src_dir), "%s/%s",
+ get_install_dir("src"), pkg.name);
} else {
- const char *destination = strcat(
- strdup(get_install_dir("src")),
- strcat(strdup("/"), pkg.name)
- );
- printf("%s\n", destination);
- cpdir(pkg.src, destination);
+ snprintf(src_dir, sizeof(src_dir), "%s/%s/%s",
+ get_install_dir("src"), pkg.name, pkg.ver);
}
+ snprintf(pkg.src, MAX_PATH_LEN, "%s", src_dir);
return pkg;
} \ No newline at end of file
diff --git a/src/files.c b/src/files.c
index 5805d22..6842d63 100644
--- a/src/files.c
+++ b/src/files.c
@@ -6,7 +6,7 @@
const char *get_filename_ext(const char *filename) {
const char *dot = strrchr(filename, '.');
- if(!dot || dot == filename) return "";
+ if (!dot || dot == filename) return "";
return dot + 1;
}
@@ -15,75 +15,72 @@ void cpdir(const char *path, const char *dest) {
struct dirent *dirp_ent;
struct stat dest_st;
- stat(dest, &dest_st);
- if (dest_st.st_mode && dest_st.st_mode == S_IFDIR) {
+ stat(path, &dest_st);
+ if ((dest_st.st_mode & S_IFDIR) != 0) {
mkdir(dest, dest_st.st_mode);
}
while ((dirp_ent = readdir(dirp))) {
if (dirp_ent->d_name[0] == '.' &&
(strlen(dirp_ent->d_name) == 1 ||
- (strlen(dirp_ent->d_name) == 2 &&
- dirp_ent->d_name[1] == '.'))
- ) continue;
+ (strlen(dirp_ent->d_name) == 2 &&
+ dirp_ent->d_name[1] == '.')
+ )
+ )
+ continue;
char rfile_line[1024];
struct stat st;
- char *filename = malloc(sizeof(path)+sizeof(dirp_ent->d_name)+2);
+ char *filename = malloc(sizeof(path) + sizeof(dirp_ent->d_name) + 2);
snprintf(
- filename,
- sizeof(path)+sizeof(dirp_ent->d_name)+2,
- "%s/%s",
- path, dirp_ent->d_name
- );
- printf("FILENAME: %s\n", filename);
+ filename,
+ sizeof(path) + sizeof(dirp_ent->d_name) + 2,
+ "%s/%s",
+ path,
+ dirp_ent->d_name
+ );
stat(filename, &st);
if (st.st_mode) {
- char *newfile = malloc(sizeof(dest)+sizeof(dirp_ent->d_name)+2);
+ char *newfile = malloc(sizeof(dest) + sizeof(dirp_ent->d_name) + 2);
snprintf(
- newfile,
- sizeof(dest)+sizeof(dirp_ent->d_name)+2,
- "%s/%s",
- dest, dirp_ent->d_name
+ newfile,
+ sizeof(dest) + sizeof(dirp_ent->d_name) + 2,
+ "%s/%s",
+ dest,
+ dirp_ent->d_name
);
- if (st.st_mode == S_IFDIR) {
- printf("DIRECTORY\n");
- printf("NEWDIR: %s\n", newfile);
+ if ((st.st_mode & S_IFDIR) != 0) {
mkdir(newfile, st.st_mode);
cpdir(filename, newfile);
continue;
}
FILE *rfile = fopen(dirp_ent->d_name, "r");
FILE *wfile = fopen(newfile, "w+");
- if (!rfile || !wfile) { continue; }
- size_t ret = fread(
- rfile_line,
- //sizeof(*rfile_line),
- //sizeof(rfile_line)/sizeof(rfile_line[0]),
- 1,
- 1024,
- rfile
- );
- if (ret != sizeof(rfile_line)/sizeof(rfile_line[0]) && ferror(rfile)) {
- fprintf(stderr, "file read failed: %zu\n", ret);
+ if (!rfile || !wfile) {
continue;
}
- size_t write = fwrite(
- rfile_line,
- //sizeof(rfile_line[0]),
- 1,
- ret,
- wfile
- );
- if (write != sizeof(rfile_line)/sizeof(rfile_line[0])) {
- fprintf(stderr, "file write failed: %zu\n", ret);
- continue;
- }
- if (feof(rfile)) {
- fclose(rfile);
- fclose(wfile);
- continue;
+ while (1) {
+ size_t ret = fread(rfile_line, 1, 1024, rfile);
+ if (ret != sizeof(rfile_line) / sizeof(rfile_line[0]) && ferror(rfile)) {
+ fprintf(stderr, "file read failed: %zu\n", ret);
+ break;
+ }
+ if (feof(rfile)) {
+ fclose(rfile);
+ fclose(wfile);
+ break;
+ }
+ size_t write = fwrite(rfile_line, 1, ret, wfile);
+ if (write != sizeof(rfile_line) / sizeof(rfile_line[0])) {
+ fprintf(stderr, "file write failed: %zu\n", ret);
+ break;
+ }
+ free(newfile);
+ if (feof(rfile)) {
+ fclose(rfile);
+ fclose(wfile);
+ break;
+ }
}
- free(newfile);
}
free(filename);
}
diff --git a/src/install_pkg.c b/src/install_pkg.c
index c0809e8..e92eab2 100644
--- a/src/install_pkg.c
+++ b/src/install_pkg.c
@@ -6,6 +6,7 @@
#include "add_repo.h"
#include "build.h"
#include "fetch_src.h"
+#include "files.h"
#include "install_pkg.h"
#include "lua_state.h"
#include "name_from_url.h"
@@ -27,7 +28,11 @@ void install_pkg(Pkg pkg) {
}
}
- if (!pkg.is_local) {
+ if (pkg.is_local) {
+ char cwd[MAX_PATH_LEN];
+ getcwd(cwd, MAX_PATH_LEN);
+ cpdir(cwd, pkg.src);
+ } else {
printf(
"%s fetching %s%s%s\n",
print_pkgit, green, pkg.name, color_reset
diff --git a/src/lua_state.c b/src/lua_state.c
index c23eb92..623c87b 100644
--- a/src/lua_state.c
+++ b/src/lua_state.c
@@ -610,7 +610,7 @@ bool config_install(const char *path, const char *target) {
return false;
}
target_loop_success = target_loop_install(L, "init.lua", target);
- lua_pop(L, 1);
+ lua_pop(L, 2);
}
lua_pop(L, 1);
return target_loop_success;
@@ -647,7 +647,7 @@ bool config_uninstall(const char *path, const char *target) {
return false;
}
target_loop_success = target_loop_uninstall(L, "init.lua", target);
- lua_pop(L, 1);
+ lua_pop(L, 2);
}
lua_pop(L, 1);
return target_loop_success;
diff --git a/src/remove_pkg.c b/src/remove_pkg.c
index 14e1f4a..ac723b3 100644
--- a/src/remove_pkg.c
+++ b/src/remove_pkg.c
@@ -61,7 +61,7 @@ static int remove_tree(const char *fpath, const struct stat *sb, int typeflag,
}
void remove_pkg(Pkg pkg) {
- if (!file_exists(pkg.src)) {
+ if (!is_directory(pkg.src)) {
printf("%s %s is not installed!\n", print_pkgit, pkg.name);
return;
}