diff options
Diffstat (limited to 'src/pkg_create.c')
| -rw-r--r-- | src/pkg_create.c | 59 |
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); |
