/*
pow! - the pow!erful package manager
Copyright (C) 2026 forever2k38
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "repo.h"
#include "config.h"
#include "log.h"
#include "dirent.h"
#include "limits.h"
#include "malloc.h"
#include "package.h"
#include "stdio.h"
#include
int pow_repo_get_package(pow_config *cfg, pow_package *pkg,
const char *query) {
if (!cfg->repos) {
pow_log_error("no repos defined in your config, please define them");
return 1;
}
DIR *dp;
struct dirent *ep;
for (size_t i = 0; i < cfg->repos_count; i++) {
char *package_path = malloc(PATH_MAX);
if (!package_path) {
pow_log_error("failed to allocate package_path, sizeof %d", PATH_MAX);
return 1;
}
int written =
snprintf(package_path, PATH_MAX, "%s/%s", cfg->repos[i]->path, query);
if (written >= PATH_MAX) {
pow_log_error("something went seriously wrong. the path for the package %s is "
"too long?",
query);
free(package_path);
return 1;
}
dp = opendir(package_path);
if (!dp) {
free(package_path);
continue;
}
pow_log_info("found package %s in repo %s", query, cfg->repos[i]->path);
char *full_path = malloc(PATH_MAX);
if (!full_path) {
free(package_path);
pow_log_error("failed to malloc full path for build script");
return 1;
}
written = snprintf(full_path, PATH_MAX, "%s/%s", package_path, "build.lua");
if (written >= PATH_MAX) {
pow_log_error("something went seriously wrong. the path for the package build "
"script %s is "
"too long?",
query);
free(package_path);
free(full_path);
return 1;
}
free(package_path);
pow_package_open(pkg, cfg, full_path);
free(full_path);
closedir(dp);
return 0;
}
return 1;
}
int pow_repo_check_package(pow_config *cfg,
const char *query) {
int err;
pow_package *pkg = malloc(sizeof(pow_package));
if (!pkg) {
pow_log_error("failed to malloc pow_package");
return 1;
}
err = pow_repo_get_package(cfg, pkg, query);
if (err) {
return 1;
}
printf("Name: %s\n"
"Version: %s\n",
pkg->name, pkg->version);
pow_package_close(pkg);
return 0;
}