diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2009-05-14 12:01:09 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2009-05-14 12:01:09 +0000 |
commit | b91f9406dacb8585dd2f50548f72a36f378f5933 (patch) | |
tree | 85625267da7ee951c3ffd542783dfd0e4c08d244 /src/add.c | |
parent | 6db3bbd790954ce2db241fd68f4b10e34c442893 (diff) | |
download | apk-tools-b91f9406dacb8585dd2f50548f72a36f378f5933.tar.gz apk-tools-b91f9406dacb8585dd2f50548f72a36f378f5933.tar.bz2 apk-tools-b91f9406dacb8585dd2f50548f72a36f378f5933.tar.xz apk-tools-b91f9406dacb8585dd2f50548f72a36f378f5933.zip |
add: support for virtual meta packages
implements 'apk add --virutal metaname dep1 dep2...' where metaname will
be an empy meta package with dep1 and dep2 as dependencies.
This is useful to prevent abuild to add each makedepend to world which
causes some headache when it comes to unintalling them after sucessful build.
Diffstat (limited to 'src/add.c')
-rw-r--r-- | src/add.c | 38 |
1 files changed, 34 insertions, 4 deletions
@@ -17,6 +17,7 @@ struct add_ctx { unsigned int open_flags; + const char *virtpkg; }; static int add_parse(void *ctx, int optch, int optindex, const char *optarg) @@ -30,6 +31,9 @@ static int add_parse(void *ctx, int optch, int optindex, const char *optarg) case 'u': apk_flags |= APK_UPGRADE; break; + case 't': + actx->virtpkg = optarg; + break; default: return -1; } @@ -41,12 +45,33 @@ static int add_main(void *ctx, int argc, char **argv) struct add_ctx *actx = (struct add_ctx *) ctx; struct apk_database db; struct apk_state *state = NULL; - struct apk_dependency_array *pkgs = NULL; /* list of pkgs to install */ + struct apk_dependency_array *pkgs = NULL; + struct apk_package *virtpkg = NULL; int i, r; r = apk_db_open(&db, apk_root, actx->open_flags | APK_OPENF_WRITE); if (r != 0) return r; + + if (actx->virtpkg) { + struct apk_dependency dep; + virtpkg = apk_pkg_new(); + if (virtpkg == NULL) { + apk_error("Failed to allocate virtual meta package"); + goto err; + } + virtpkg->name = apk_db_get_name(&db, APK_BLOB_STR(actx->virtpkg)); + virtpkg->version = strdup("0"); + virtpkg->description = strdup("virtual meta package"); + dep = (struct apk_dependency) { + .name = virtpkg->name, + .version = virtpkg->version, + .result_mask = APK_VERSION_EQUAL, + }; + dep.name->flags |= APK_NAME_TOPLEVEL | APK_NAME_VIRTUAL; + virtpkg = apk_db_pkg_add(&db, virtpkg); + apk_deps_add(&pkgs, &dep); + } for (i = 0; i < argc; i++) { struct apk_dependency dep; @@ -71,8 +96,12 @@ static int add_main(void *ctx, int argc, char **argv) .result_mask = APK_DEPMASK_REQUIRE, }; } - dep.name->flags |= APK_NAME_TOPLEVEL; - apk_deps_add(&pkgs, &dep); + if (virtpkg) { + apk_deps_add(&virtpkg->depends, &dep); + } else { + dep.name->flags |= APK_NAME_TOPLEVEL; + apk_deps_add(&pkgs, &dep); + } } state = apk_state_new(&db); @@ -95,11 +124,12 @@ err: static struct option add_options[] = { { "initdb", no_argument, NULL, 0x10000 }, { "upgrade", no_argument, NULL, 'u' }, + { "virtual", required_argument, NULL, 't' }, }; static struct apk_applet apk_add = { .name = "add", - .usage = "[--initdb] [--upgrade|-u] apkname...", + .usage = "[--initdb] [--upgrade|-u] [--virtual metaname] apkname...", .context_size = sizeof(struct add_ctx), .num_options = ARRAY_SIZE(add_options), .options = add_options, |