new: support installing local package archives

This commit is contained in:
ngn 2024-08-06 04:45:51 +03:00
parent 049642d06b
commit 43733a2c3e
6 changed files with 109 additions and 46 deletions

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-04 15:54+0300\n" "POT-Creation-Date: 2024-08-06 04:45+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -135,7 +135,7 @@ msgid "Here is a list of available global options:"
msgstr "Here is a list of available global options:" msgstr "Here is a list of available global options:"
#: src/main.c:174 src/main.c:175 src/cmd/info.c:43 src/cmd/info.c:44 #: src/main.c:174 src/main.c:175 src/cmd/info.c:43 src/cmd/info.c:44
#: src/cmd/info.c:45 src/cmd/install.c:26 src/cmd/install.c:27 #: src/cmd/info.c:45 src/cmd/install.c:31 src/cmd/install.c:32
#: src/cmd/list.c:14 src/cmd/list.c:15 src/cmd/remove.c:21 src/cmd/remove.c:22 #: src/cmd/list.c:14 src/cmd/list.c:15 src/cmd/remove.c:21 src/cmd/remove.c:22
#: src/cmd/update.c:30 #: src/cmd/update.c:30
#, c-format #, c-format
@ -162,7 +162,7 @@ msgstr "Failed to run the editor: %s"
msgid "Failed to open the editor: %s" msgid "Failed to open the editor: %s"
msgstr "Failed to open the editor: %s" msgstr "Failed to open the editor: %s"
#: src/cmd/info.c:19 src/cmd/info.c:29 src/cmd/install.c:60 src/cmd/remove.c:46 #: src/cmd/info.c:19 src/cmd/info.c:29 src/cmd/install.c:84 src/cmd/remove.c:43
msgid "Package " msgid "Package "
msgstr "Package " msgstr "Package "
@ -170,7 +170,7 @@ msgstr "Package "
msgid "Listing options for the list command:" msgid "Listing options for the list command:"
msgstr "Listing options for the list command:" msgstr "Listing options for the list command:"
#: src/cmd/info.c:66 #: src/cmd/info.c:65
msgid "Please specify only a single package name" msgid "Please specify only a single package name"
msgstr "Please specify only a single package name" msgstr "Please specify only a single package name"
@ -230,66 +230,76 @@ msgstr "Installed "
msgid "Up-to-date " msgid "Up-to-date "
msgstr "Up-to-date " msgstr "Up-to-date "
#: src/cmd/install.c:25 #: src/cmd/install.c:30
msgid "Listing options for the install command:" msgid "Listing options for the install command:"
msgstr "Listing options for the install command:" msgstr "Listing options for the install command:"
#: src/cmd/install.c:32 src/cmd/update.c:35 #: src/cmd/install.c:37 src/cmd/update.c:35
msgid "There are no avaliable pools, have you synced yet?" msgid "There are no avaliable pools, have you synced yet?"
msgstr "There are no avaliable pools, have you synced yet?" msgstr "There are no avaliable pools, have you synced yet?"
#: src/cmd/install.c:52 src/cmd/remove.c:48 #: src/cmd/install.c:55
msgid "Specified "
msgstr ""
#: src/cmd/install.c:65
#, fuzzy
msgid "Failed to load "
msgstr "Failed to download "
#: src/cmd/install.c:75 src/cmd/remove.c:45
msgid "Failed to find " msgid "Failed to find "
msgstr "Failed to find " msgstr "Failed to find "
#: src/cmd/install.c:66 #: src/cmd/install.c:90
msgid "Failed to resolve " msgid "Failed to resolve "
msgstr "Failed to resolve " msgstr "Failed to resolve "
#: src/cmd/install.c:72 #: src/cmd/install.c:96
msgid "Nothing to do (no packages to install)" msgid "Nothing to do (no packages to install)"
msgstr "Nothing to do (no packages to install)" msgstr "Nothing to do (no packages to install)"
#: src/cmd/install.c:81 src/cmd/install.c:83 src/cmd/remove.c:68 #: src/cmd/install.c:105 src/cmd/install.c:107 src/cmd/remove.c:65
#: src/cmd/remove.c:70 src/cmd/update.c:56 src/cmd/update.c:58 #: src/cmd/remove.c:67 src/cmd/update.c:56 src/cmd/update.c:58
msgid "Following " msgid "Following "
msgstr "Following " msgstr "Following "
#: src/cmd/install.c:89 src/cmd/remove.c:77 #: src/cmd/install.c:113 src/cmd/remove.c:74
msgid "Total of " msgid "Total of "
msgstr "Total of " msgstr "Total of "
#: src/cmd/install.c:92 src/cmd/update.c:65 #: src/cmd/install.c:116 src/cmd/update.c:65
#, c-format #, c-format
msgid "Root directory is modified, install scripts will be saved in %s" msgid "Root directory is modified, install scripts will be saved in %s"
msgstr "Root directory is modified, install scripts will be saved in %s" msgstr "Root directory is modified, install scripts will be saved in %s"
#: src/cmd/install.c:94 src/cmd/remove.c:78 src/cmd/update.c:67 #: src/cmd/install.c:118 src/cmd/remove.c:75 src/cmd/update.c:67
msgid "Continue?" msgid "Continue?"
msgstr "Continue?" msgstr "Continue?"
#: src/cmd/install.c:95 src/cmd/remove.c:79 src/cmd/update.c:68 #: src/cmd/install.c:119 src/cmd/remove.c:76 src/cmd/update.c:68
msgid "Operation cancelled" msgid "Operation cancelled"
msgstr "Operation cancelled" msgstr "Operation cancelled"
#: src/cmd/install.c:101 src/cmd/install.c:116 src/cmd/remove.c:86 #: src/cmd/install.c:135 src/cmd/install.c:139 src/cmd/install.c:154
#: src/cmd/update.c:78 src/cmd/update.c:87 src/cmd/update.c:96 #: src/cmd/remove.c:83 src/cmd/update.c:78 src/cmd/update.c:87
#: src/cmd/update.c:96
msgid "(" msgid "("
msgstr "(" msgstr "("
#: src/cmd/install.c:107 src/cmd/update.c:83 #: src/cmd/install.c:145 src/cmd/update.c:83
msgid "Failed to download " msgid "Failed to download "
msgstr "Failed to download " msgstr "Failed to download "
#: src/cmd/install.c:122 src/cmd/update.c:101 #: src/cmd/install.c:160 src/cmd/update.c:101
msgid "Failed to install " msgid "Failed to install "
msgstr "Failed to install " msgstr "Failed to install "
#: src/cmd/install.c:128 #: src/cmd/install.c:166
msgid "Installed " msgid "Installed "
msgstr "Installed " msgstr "Installed "
#: src/cmd/install.c:128 #: src/cmd/install.c:166
msgid "Installed all of the " msgid "Installed all of the "
msgstr "Installed all of the " msgstr "Installed all of the "
@ -305,23 +315,23 @@ msgstr "Listing "
msgid "Listing options for the remove command:" msgid "Listing options for the remove command:"
msgstr "Listing options for the remove command:" msgstr "Listing options for the remove command:"
#: src/cmd/remove.c:53 #: src/cmd/remove.c:50
msgid "Cannot remove " msgid "Cannot remove "
msgstr "Cannot remove " msgstr "Cannot remove "
#: src/cmd/remove.c:61 #: src/cmd/remove.c:58
msgid "Nothing to do (no packages to remove)" msgid "Nothing to do (no packages to remove)"
msgstr "Nothing to do (no packages to remove)" msgstr "Nothing to do (no packages to remove)"
#: src/cmd/remove.c:92 src/cmd/update.c:92 #: src/cmd/remove.c:89 src/cmd/update.c:92
msgid "Failed to remove " msgid "Failed to remove "
msgstr "Failed to remove " msgstr "Failed to remove "
#: src/cmd/remove.c:98 #: src/cmd/remove.c:95
msgid "Removed " msgid "Removed "
msgstr "Removed " msgstr "Removed "
#: src/cmd/remove.c:98 #: src/cmd/remove.c:95
msgid "Removed all of the " msgid "Removed all of the "
msgstr "Removed all of the " msgstr "Removed all of the "

View File

@ -53,18 +53,18 @@ bool cmd_info(lm_ctx_t *ctx, config_t *config, args_t *args){
lm_pkg_data_t *data = NULL; lm_pkg_data_t *data = NULL;
lm_entry_t ent; lm_entry_t ent;
for(size_t i = 0; i < args->count; i++){ for(size_t i = 1; i < args->count; i++){
if(NULL != args->list[i].name || eq(args->list[i].value, "info")) if(NULL != args->list[i].name)
continue; continue;
if(NULL == name){ if(NULL == name && NULL != (name = args->list[i].value))
name = args->list[i].value;
continue; continue;
else if(NULL != name && NULL != (name = args->list[i].value)){
if(!args_get_bool(args, "grep"))
error(_("Please specify only a single package name"));
return false;
} }
if(!args_get_bool(args, "grep"))
error(_("Please specify only a single package name"));
return false;
} }
if(NULL == name){ if(NULL == name){

View File

@ -1,4 +1,9 @@
#include <libmp/all.h> #include <libmp/all.h>
#include <libmp/ctx.h>
#include <libmp/error.h>
#include <libmp/package.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include "../util.h" #include "../util.h"
@ -33,19 +38,37 @@ bool cmd_install(lm_ctx_t *ctx, config_t *config, args_t *args){
return false; return false;
} }
ssize_t current = 0, size = 0, save = 0, li = 0;
bool ret = false, r = false, is_local = false;
lm_pkg_t *pkg = NULL, *locals = NULL;
lm_ctx_resolve_list_t *list = NULL; lm_ctx_resolve_list_t *list = NULL;
ssize_t current = 0, size = 0, save = 0;
bool ret = false, r = false;
char ssize[LONGSTR_MAX+3]; char ssize[LONGSTR_MAX+3];
lm_pkg_t *pkg = NULL;
char *name = NULL; char *name = NULL;
for(int i = 0; i < args->count; i++){ for(size_t i = 1; i < args->count; i++){
if(NULL != args->list[i].name) if(NULL != args->list[i].name || NULL == (name = args->list[i].value))
continue; continue;
if(eq((name = args->list[i].value), "install")) // if thiş is a local archive, load it
continue; if(endswith(name, ".mpf") && access(name, F_OK) == 0){
if(access(name, R_OK) != 0){
error(_("Specified "FG_BOLD"%s"FG_RESET" archive does not have read access"), name);
goto end;
}
if(NULL == locals)
locals = malloc(sizeof(lm_pkg_t));
else
locals = realloc(locals, sizeof(lm_pkg_t)*((++li)+1));
if(!lm_ctx_package_from(ctx, &locals[li], name)){
error(_("Failed to load "FG_BOLD"%s"FG_RESET": %s"), name, lm_strerror());
goto end;
}
pkg = &locals[li];
goto resolve;
}
// find the package // find the package
if((pkg = lm_ctx_pool_find(ctx, name, NULL)) == NULL){ if((pkg = lm_ctx_pool_find(ctx, name, NULL)) == NULL){
@ -56,6 +79,7 @@ bool cmd_install(lm_ctx_t *ctx, config_t *config, args_t *args){
goto end; goto end;
} }
resolve:
if(lm_ctx_database_is_installed(ctx, pkg->data.name, pkg->data.version)){ if(lm_ctx_database_is_installed(ctx, pkg->data.name, pkg->data.version)){
error(_("Package "FG_BOLD"%s"FG_RESET"_"FG_GREEN"%s"FG_RESET" is already installed"), name, pkg->data.version); error(_("Package "FG_BOLD"%s"FG_RESET"_"FG_GREEN"%s"FG_RESET" is already installed"), name, pkg->data.version);
goto end; goto end;
@ -98,6 +122,20 @@ bool cmd_install(lm_ctx_t *ctx, config_t *config, args_t *args){
// download resolved packages // download resolved packages
while((pkg = lm_ctx_resolve_next(list)) != NULL){ while((pkg = lm_ctx_resolve_next(list)) != NULL){
is_local = false;
for(size_t i = 0; i < (li+1) && NULL != locals; i++){
if(lm_package_is_same(&locals[i], pkg)){
is_local = true;
break;
}
}
if(is_local){
info(_("("FG_BOLD"%d"FG_RESET"/"FG_BOLD"%d"FG_RESET") Skipping local package "FG_BOLD"%s"FG_RESET"_"FG_BOLD FG_GREEN"%s"), ++current, list->count, pkg->data.name, pkg->data.version);
continue;
}
info(_("("FG_BOLD"%d"FG_RESET"/"FG_BOLD"%d"FG_RESET") Downloading "FG_BOLD"%s"FG_RESET"_"FG_BOLD FG_GREEN"%s"), ++current, list->count, pkg->data.name, pkg->data.version); info(_("("FG_BOLD"%d"FG_RESET"/"FG_BOLD"%d"FG_RESET") Downloading "FG_BOLD"%s"FG_RESET"_"FG_BOLD FG_GREEN"%s"), ++current, list->count, pkg->data.name, pkg->data.version);
r = lm_ctx_download(ctx, pkg, cmd_download_callback, NULL); r = lm_ctx_download(ctx, pkg, cmd_download_callback, NULL);
@ -131,6 +169,11 @@ bool cmd_install(lm_ctx_t *ctx, config_t *config, args_t *args){
end: end:
bar_free(); bar_free();
for(size_t i = 0; i < (li+1) && NULL != locals; i++)
lm_ctx_package_from_free(&locals[li]);
free(locals);
lm_ctx_resolve_free(list); lm_ctx_resolve_free(list);
return ret; return ret;
} }

View File

@ -29,11 +29,8 @@ bool cmd_remove(lm_ctx_t *ctx, config_t *config, args_t *args){
lm_entry_t *pkgs = NULL; lm_entry_t *pkgs = NULL;
char *name = NULL; char *name = NULL;
for(int i = 0; i < args->count; i++){ for(size_t i = 1; i < args->count; i++){
if(NULL != args->list[i].name) if(NULL != args->list[i].name || NULL == (name = args->list[i].value))
continue;
if(eq((name = args->list[i].value), "remove"))
continue; continue;
if(NULL == pkgs) if(NULL == pkgs)

View File

@ -141,3 +141,15 @@ end:
bool can_run_install(lm_ctx_t *ctx) { bool can_run_install(lm_ctx_t *ctx) {
return eq(ctx->root, "/"); return eq(ctx->root, "/");
} }
bool endswith(char *str, char *suf) {
if (NULL == str || NULL == suf)
return false;
size_t strl = strlen(str), sufl = strlen(suf);
if (sufl > strl)
return false;
return strncmp(str + strl - sufl, suf, sufl) == 0;
}

View File

@ -13,3 +13,4 @@ void size_to_human(char *buf, long size);
char *exists_in_path(char *file); char *exists_in_path(char *file);
void editor_open(char *file); void editor_open(char *file);
bool can_run_install(lm_ctx_t *ctx); bool can_run_install(lm_ctx_t *ctx);
bool endswith(char *str, char *suf);