diff options
| author | dacctal <dacctal@symlinx.net> | 2026-06-11 22:13:16 +0000 |
|---|---|---|
| committer | dacctal <dacctal@symlinx.net> | 2026-06-11 22:13:16 +0000 |
| commit | f81a7ccdff682acc7a7ec2e6c4dced9bcfde4387 (patch) | |
| tree | 16c864f5ffe306a661dd37a68f54d184635ed459 | |
| parent | d057a68a837d278f5dfe55a5dc3c4998e4f126f5 (diff) | |
IT WORKSindev
| -rw-r--r-- | src/create_pkg.c | 42 | ||||
| -rw-r--r-- | src/files.c | 93 | ||||
| -rw-r--r-- | src/install_pkg.c | 7 | ||||
| -rw-r--r-- | src/lua_state.c | 4 | ||||
| -rw-r--r-- | src/remove_pkg.c | 2 |
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; } |
