Alternatives framework (1/2) (WIP).
This commit is contained in:
@ -102,6 +102,9 @@ usage(void)
|
||||
" -s --desc Short description (max 80 characters).\n"
|
||||
" -t --tags A list of tags/categories (blank separated list).\n"
|
||||
" -V --version Prints XBPS release version.\n"
|
||||
" --alternatives List of available alternatives this pkg provides.\n"
|
||||
" This expects a blank separated list of <name>:<symlink>:<target>, e.g\n"
|
||||
" 'vi:/usr/bin/vi:/usr/bin/vim foo:/usr/bin/foo:/usr/bin/blah'.\n"
|
||||
" --build-options A string with the used build options.\n"
|
||||
" --compression Compression format: none, gzip, bzip2, xz (default).\n"
|
||||
" --shlib-provides List of provided shared libraries (blank separated list,\n"
|
||||
@ -162,6 +165,72 @@ out:
|
||||
xbps_object_release(array);
|
||||
}
|
||||
|
||||
static void
|
||||
process_one_alternative(const char *altgrname, const char *val)
|
||||
{
|
||||
xbps_dictionary_t d;
|
||||
xbps_array_t a;
|
||||
char *altfiles;
|
||||
bool alloc = false;
|
||||
|
||||
if ((d = xbps_dictionary_get(pkg_propsd, "alternatives")) == NULL) {
|
||||
d = xbps_dictionary_create();
|
||||
assert(d);
|
||||
alloc = true;
|
||||
}
|
||||
if ((a = xbps_dictionary_get(d, altgrname)) == NULL) {
|
||||
a = xbps_array_create();
|
||||
assert(a);
|
||||
}
|
||||
altfiles = strchr(val, ':') + 1;
|
||||
assert(altfiles);
|
||||
|
||||
xbps_array_add_cstring(a, altfiles);
|
||||
xbps_dictionary_set(d, altgrname, a);
|
||||
xbps_dictionary_set(pkg_propsd, "alternatives", d);
|
||||
|
||||
if (alloc) {
|
||||
xbps_object_release(a);
|
||||
xbps_object_release(d);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
process_dict_of_arrays(const char *key, const char *val)
|
||||
{
|
||||
char *altgrname, *args, *p, *saveptr;
|
||||
|
||||
assert(key);
|
||||
|
||||
if (val == NULL)
|
||||
return;
|
||||
|
||||
args = strdup(val);
|
||||
assert(args);
|
||||
|
||||
if (strchr(args, ' ') == NULL) {
|
||||
altgrname = strtok(args, ":");
|
||||
assert(altgrname);
|
||||
process_one_alternative(altgrname, val);
|
||||
goto out;
|
||||
}
|
||||
|
||||
for ((p = strtok_r(args, " ", &saveptr)); p;
|
||||
(p = strtok_r(NULL, " ", &saveptr))) {
|
||||
char *b;
|
||||
|
||||
b = strdup(p);
|
||||
assert(b);
|
||||
altgrname = strtok(b, ":");
|
||||
assert(altgrname);
|
||||
process_one_alternative(altgrname, p);
|
||||
free(b);
|
||||
}
|
||||
out:
|
||||
free(args);
|
||||
}
|
||||
|
||||
static void
|
||||
process_file(const char *file, const char *key)
|
||||
{
|
||||
@ -615,6 +684,7 @@ main(int argc, char **argv)
|
||||
{ "shlib-requires", required_argument, NULL, '1' },
|
||||
{ "build-options", required_argument, NULL, '2' },
|
||||
{ "compression", required_argument, NULL, '3' },
|
||||
{ "alternatives", required_argument, NULL, '4' },
|
||||
{ NULL, 0, NULL, 0 }
|
||||
};
|
||||
struct archive *ar;
|
||||
@ -624,7 +694,7 @@ main(int argc, char **argv)
|
||||
const char *conflicts, *deps, *homepage, *license, *maint, *bwith;
|
||||
const char *provides, *pkgver, *replaces, *reverts, *desc, *ldesc;
|
||||
const char *arch, *config_files, *mutable_files, *version;
|
||||
const char *buildopts, *shlib_provides, *shlib_requires;
|
||||
const char *buildopts, *shlib_provides, *shlib_requires, *alternatives;
|
||||
const char *compression, *tags = NULL, *srcrevs = NULL;
|
||||
char *pkgname, *binpkg, *tname, *p, cwd[PATH_MAX-1];
|
||||
bool quiet = false, preserve = false;
|
||||
@ -634,7 +704,7 @@ main(int argc, char **argv)
|
||||
arch = conflicts = deps = homepage = license = maint = compression = NULL;
|
||||
provides = pkgver = replaces = reverts = desc = ldesc = bwith = NULL;
|
||||
buildopts = config_files = mutable_files = shlib_provides = NULL;
|
||||
shlib_requires = NULL;
|
||||
alternatives = shlib_requires = NULL;
|
||||
|
||||
while ((c = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1) {
|
||||
if (optarg && strcmp(optarg, "") == 0)
|
||||
@ -716,6 +786,9 @@ main(int argc, char **argv)
|
||||
case '3':
|
||||
compression = optarg;
|
||||
break;
|
||||
case '4':
|
||||
alternatives = optarg;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
@ -798,6 +871,7 @@ main(int argc, char **argv)
|
||||
process_array("reverts", reverts);
|
||||
process_array("shlib-provides", shlib_provides);
|
||||
process_array("shlib-requires", shlib_requires);
|
||||
process_dict_of_arrays("alternatives", alternatives);
|
||||
|
||||
/* save cwd */
|
||||
memset(&cwd, 0, sizeof(cwd));
|
||||
|
Reference in New Issue
Block a user