aboutsummaryrefslogtreecommitdiff
path: root/src/pkg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg.c')
-rw-r--r--src/pkg.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/pkg.c b/src/pkg.c
new file mode 100644
index 0000000..fe79b64
--- /dev/null
+++ b/src/pkg.c
@@ -0,0 +1,93 @@
+/*
+
+ pkgit - package it!
+
+ Copyright (C) 2026 dacctal
+ 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 <https://www.gnu.org/licenses/>.
+
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "common.h"
+#include "log.h"
+#include "pkg.h"
+#include "state.h"
+#include "str.h"
+
+static str get_destdir(str *cwd, str *arg) {
+ str result = {0};
+ if (str_first(arg) == '.' && arg->len == 1) {
+ result = str_format("%.*s/%.*s", str_fmt(&config.inst_dirs.src), str_fmt(cwd));
+ } else {
+ str name = {0};
+ if (str_find_char(arg, '/') != 0) name = str_from_after_delim(arg, '/');
+ else str_copy_into(&name, arg);
+ result = str_format("%.*s/%.*s", str_fmt(&config.inst_dirs.src), str_fmt(&name));
+ str_free(&name);
+ }
+ return result;
+}
+
+static str get_pkgsrc(package_t *pkg) {
+ if (pkg->is_local == 1)
+ return str_format("%.*s/%.*s", str_fmt(&config.inst_dirs.src), str_fmt(&pkg->name));
+ else
+ return str_format("%.*s/%.*s/%.*s", str_fmt(&config.inst_dirs.src),
+ str_fmt(&pkg->name), str_fmt(&pkg->version));
+}
+
+static void assign_pkg_version(package_t *pkg, str *new_arg_str) {
+ if (str_find_char(new_arg_str, '@')) {
+ pkg->version = str_from_after_delim(new_arg_str, '@');
+ pkg->name.len -= pkg->version.len + 1;
+ } else str_copy_cstr_into(&pkg->version, "HEAD");;
+}
+
+package_t pkg_create(str *arg) {
+ package_t pkg = { .is_local = false, };
+
+ assign_pkg_version(&pkg, arg);
+
+ char cwd_cstr[MAX_PATH_LEN];
+ getcwd(cwd_cstr, MAX_PATH_LEN);
+ str cwd = mstr(cwd_cstr);
+ str destdir = get_destdir(&cwd, arg);
+
+ if (strncmp(arg->data, "http", 4) == 0 || strncmp(arg->data, "ssh", 3) == 0) {
+ str_copy_into(&pkg.url, arg);
+ pkg.name = str_from_after_delim(arg, '/');
+ } else if (str_equal_cstr(arg, ".")) {
+ str_copy_cstr_into(&pkg.url, "");
+ pkg.name = str_from_after_delim(&cwd, '/');
+ pkg.is_local = true;
+ } else if (pkg_exists(arg)) {
+ str_copy_into(&pkg.name, arg);
+ pkg.url = pkg_get_url(&pkg);
+// } else if (is_installed_locally) {
+// str_copy_cstr_into(&pkg.url, "");
+// pkg.name = str_from_after_delim(&destdir, '/');
+// pkg.is_local = true;
+ } else {
+ log_error("'%.*s' is not a valid package", str_fmt(arg));
+ str_free(&cwd);
+ str_free(&destdir);
+ str_free(arg);
+ abort();
+ }
+
+ return pkg;
+}