summaryrefslogtreecommitdiffstats
path: root/src/add.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2009-05-14 12:01:09 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2009-05-14 12:01:09 +0000
commitb91f9406dacb8585dd2f50548f72a36f378f5933 (patch)
tree85625267da7ee951c3ffd542783dfd0e4c08d244 /src/add.c
parent6db3bbd790954ce2db241fd68f4b10e34c442893 (diff)
downloadapk-tools-b91f9406dacb8585dd2f50548f72a36f378f5933.tar.bz2
apk-tools-b91f9406dacb8585dd2f50548f72a36f378f5933.tar.xz
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.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/add.c b/src/add.c
index cf518af..da83fe0 100644
--- a/src/add.c
+++ b/src/add.c
@@ -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,