aboutsummaryrefslogtreecommitdiff
path: root/src/pkg_create.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg_create.c')
-rw-r--r--src/pkg_create.c59
1 files changed, 50 insertions, 9 deletions
diff --git a/src/pkg_create.c b/src/pkg_create.c
index ebf0745..29482a9 100644
--- a/src/pkg_create.c
+++ b/src/pkg_create.c
@@ -44,13 +44,42 @@ static str get_pkgsrc(package_t pkg) {
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, '@')) {
+ str tmp_arg = str_from_after_delim(new_arg_str, '@');
+ if (str_find_char(new_arg_str, ',')) {
+ str tmp_trg = str_from_after_delim(&tmp_arg, ',');
+ pkg->version = str_from_after_delim(new_arg_str, '@');
+ pkg->version.len -= tmp_trg.len;
+ str_free(&tmp_trg);
+ } else {
+ pkg->version = str_from_after_delim(new_arg_str, '@');
+ }
+ if (str_find_char(&pkg->version, ',')) pkg->version.len--;
+ str_free(&tmp_arg);
+ pkg->name.len -= pkg->version.len + 1;
+ } else pkg->version = mstr("HEAD");
+}
+
+static void assign_pkg_target(package_t *pkg, str *new_arg_str) {
+ if (str_find_char(new_arg_str, ',')) {
+ str tmp_arg = str_from_after_delim(new_arg_str, ',');
+ if (str_find_char(new_arg_str, '@')) {
+ str tmp_ver = str_from_after_delim(&tmp_arg, '@');
+ pkg->target = str_from_after_delim(new_arg_str, ',');
+ pkg->target.len -= tmp_ver.len;
+ str_free(&tmp_ver);
+ } else {
+ pkg->target = str_from_after_delim(new_arg_str, ',');
+ }
+ if (str_find_char(&pkg->target, '@')) pkg->target.len--;
+ str_free(&tmp_arg);
+ pkg->name.len -= pkg->target.len + 1;
+ } else pkg->target = mstr("default");
+}
+
package_t pkg_create(str_slc arg) {
- str ver_buf = mstr("HEAD");
- package_t pkg = {
- .version = ver_buf,
- .is_local = false,
- };
- str_free(&ver_buf);
+ package_t pkg = { .is_local = false, };
char cwd[MAX_PATH_LEN];
getcwd(cwd, MAX_PATH_LEN);
@@ -62,9 +91,6 @@ package_t pkg_create(str_slc arg) {
bool is_installed_locally = is_directory(dest_dir.data);
- pkg.version = str_from_after_delim(&new_arg_str, '@');
- pkg.target = str_from_after_delim(&new_arg_str, ',');
-
bool is_in_repos = false;
// for (size_t i = 0; i < cached_repos_count; i++) {
// if (strcmp(new_arg, cached_repos[i].source_key) == 0) {
@@ -73,6 +99,18 @@ package_t pkg_create(str_slc arg) {
// }
// }
+ assign_pkg_version(&pkg, &new_arg_str);
+ assign_pkg_target(&pkg, &new_arg_str);
+ if (str_find_char(&new_arg_str, '@')) {
+ str tmp = str_from_after_delim(&new_arg_str, '@');
+ new_arg_str.len -= tmp.len + 1;
+ str_free(&tmp);
+ }
+ if (str_find_char(&new_arg_str, ',')) {
+ str tmp = str_from_after_delim(&new_arg_str, ',');
+ new_arg_str.len -= tmp.len + 1;
+ str_free(&tmp);
+ }
if (strncmp(arg.data, "http", 4) == 0 || strncmp(arg.data, "ssh", 3) == 0) {
pkg.url = new_arg_str;
pkg.name = str_from_after_delim(&new_arg_str, '/');
@@ -96,6 +134,9 @@ package_t pkg_create(str_slc arg) {
log_error("'%.*s' is not a valid package", str_fmt(&arg));
exit(EXIT_FAILURE);
}
+ if (str_find_char(&new_arg_str, ',')
+ && str_find_char(&new_arg_str, '@')
+ ) pkg.name.len--;
pkg.src = get_pkgsrc(pkg);
str_free(&cwd_str);
str_free(&dest_dir);