Hook new optdepend structures up
No new behaviour introduced, everything should work exactly as before. Dan: refactored to use the single alpm_depend_t structure. Signed-off-by: Benedikt Morbach <benedikt.morbach@googlemail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
00f29cbc14
commit
e85e77e6f9
7 changed files with 96 additions and 24 deletions
|
@ -820,7 +820,7 @@ alpm_list_t *alpm_pkg_get_depends(alpm_pkg_t *pkg);
|
||||||
|
|
||||||
/** Returns the list of package optional dependencies.
|
/** Returns the list of package optional dependencies.
|
||||||
* @param pkg a pointer to package
|
* @param pkg a pointer to package
|
||||||
* @return a reference to an internal list of strings.
|
* @return a reference to an internal list of alpm_depend_t structures.
|
||||||
*/
|
*/
|
||||||
alpm_list_t *alpm_pkg_get_optdepends(alpm_pkg_t *pkg);
|
alpm_list_t *alpm_pkg_get_optdepends(alpm_pkg_t *pkg);
|
||||||
|
|
||||||
|
|
|
@ -611,7 +611,7 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
|
||||||
} else if(strcmp(line, "%DEPENDS%") == 0) {
|
} else if(strcmp(line, "%DEPENDS%") == 0) {
|
||||||
READ_AND_SPLITDEP(info->depends);
|
READ_AND_SPLITDEP(info->depends);
|
||||||
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
||||||
READ_AND_STORE_ALL(info->optdepends);
|
READ_AND_SPLITDEP(info->optdepends);
|
||||||
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
||||||
READ_AND_SPLITDEP(info->conflicts);
|
READ_AND_SPLITDEP(info->conflicts);
|
||||||
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
||||||
|
@ -829,7 +829,9 @@ int _alpm_local_db_write(alpm_db_t *db, alpm_pkg_t *info, alpm_dbinfrq_t inforeq
|
||||||
if(info->optdepends) {
|
if(info->optdepends) {
|
||||||
fputs("%OPTDEPENDS%\n", fp);
|
fputs("%OPTDEPENDS%\n", fp);
|
||||||
for(lp = info->optdepends; lp; lp = lp->next) {
|
for(lp = info->optdepends; lp; lp = lp->next) {
|
||||||
fprintf(fp, "%s\n", (char *)lp->data);
|
char *optstring = alpm_dep_compute_string(lp->data);
|
||||||
|
fprintf(fp, "%s\n", optstring);
|
||||||
|
free(optstring);
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "handle.h"
|
#include "handle.h"
|
||||||
#include "package.h"
|
#include "package.h"
|
||||||
#include "deps.h" /* _alpm_splitdep */
|
#include "deps.h"
|
||||||
|
|
||||||
struct package_changelog {
|
struct package_changelog {
|
||||||
struct archive *archive;
|
struct archive *archive;
|
||||||
|
@ -214,7 +214,8 @@ static int parse_descfile(alpm_handle_t *handle, struct archive *a, alpm_pkg_t *
|
||||||
alpm_depend_t *dep = _alpm_splitdep(ptr);
|
alpm_depend_t *dep = _alpm_splitdep(ptr);
|
||||||
newpkg->depends = alpm_list_add(newpkg->depends, dep);
|
newpkg->depends = alpm_list_add(newpkg->depends, dep);
|
||||||
} else if(strcmp(key, "optdepend") == 0) {
|
} else if(strcmp(key, "optdepend") == 0) {
|
||||||
newpkg->optdepends = alpm_list_add(newpkg->optdepends, strdup(ptr));
|
alpm_depend_t *optdep = _alpm_splitdep(ptr);
|
||||||
|
newpkg->optdepends = alpm_list_add(newpkg->optdepends, optdep);
|
||||||
} else if(strcmp(key, "conflict") == 0) {
|
} else if(strcmp(key, "conflict") == 0) {
|
||||||
alpm_depend_t *conflict = _alpm_splitdep(ptr);
|
alpm_depend_t *conflict = _alpm_splitdep(ptr);
|
||||||
newpkg->conflicts = alpm_list_add(newpkg->conflicts, conflict);
|
newpkg->conflicts = alpm_list_add(newpkg->conflicts, conflict);
|
||||||
|
|
|
@ -566,7 +566,7 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
|
||||||
} else if(strcmp(line, "%DEPENDS%") == 0) {
|
} else if(strcmp(line, "%DEPENDS%") == 0) {
|
||||||
READ_AND_SPLITDEP(pkg->depends);
|
READ_AND_SPLITDEP(pkg->depends);
|
||||||
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
||||||
READ_AND_STORE_ALL(pkg->optdepends);
|
READ_AND_SPLITDEP(pkg->optdepends);
|
||||||
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
||||||
READ_AND_SPLITDEP(pkg->conflicts);
|
READ_AND_SPLITDEP(pkg->conflicts);
|
||||||
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
||||||
|
|
|
@ -522,7 +522,7 @@ int _alpm_pkg_dup(alpm_pkg_t *pkg, alpm_pkg_t **new_ptr)
|
||||||
newpkg->backup = alpm_list_add(newpkg->backup, _alpm_backup_dup(i->data));
|
newpkg->backup = alpm_list_add(newpkg->backup, _alpm_backup_dup(i->data));
|
||||||
}
|
}
|
||||||
newpkg->depends = list_depdup(pkg->depends);
|
newpkg->depends = list_depdup(pkg->depends);
|
||||||
newpkg->optdepends = alpm_list_strdup(pkg->optdepends);
|
newpkg->optdepends = list_depdup(pkg->optdepends);
|
||||||
newpkg->conflicts = list_depdup(pkg->conflicts);
|
newpkg->conflicts = list_depdup(pkg->conflicts);
|
||||||
newpkg->provides = list_depdup(pkg->provides);
|
newpkg->provides = list_depdup(pkg->provides);
|
||||||
for(i = pkg->deltas; i; i = i->next) {
|
for(i = pkg->deltas; i; i = i->next) {
|
||||||
|
@ -597,7 +597,7 @@ void _alpm_pkg_free(alpm_pkg_t *pkg)
|
||||||
alpm_list_free_inner(pkg->backup, (alpm_list_fn_free)_alpm_backup_free);
|
alpm_list_free_inner(pkg->backup, (alpm_list_fn_free)_alpm_backup_free);
|
||||||
alpm_list_free(pkg->backup);
|
alpm_list_free(pkg->backup);
|
||||||
free_deplist(pkg->depends);
|
free_deplist(pkg->depends);
|
||||||
FREELIST(pkg->optdepends);
|
free_deplist(pkg->optdepends);
|
||||||
free_deplist(pkg->conflicts);
|
free_deplist(pkg->conflicts);
|
||||||
free_deplist(pkg->provides);
|
free_deplist(pkg->provides);
|
||||||
alpm_list_free_inner(pkg->deltas, (alpm_list_fn_free)_alpm_delta_free);
|
alpm_list_free_inner(pkg->deltas, (alpm_list_fn_free)_alpm_delta_free);
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
|
|
||||||
/** Turn a depends list into a text list.
|
/** Turn a depends list into a text list.
|
||||||
* @param deps a list with items of type alpm_depend_t
|
* @param deps a list with items of type alpm_depend_t
|
||||||
* @return a string list, must be freed
|
|
||||||
*/
|
*/
|
||||||
static void deplist_display(const char *title,
|
static void deplist_display(const char *title,
|
||||||
alpm_list_t *deps)
|
alpm_list_t *deps)
|
||||||
|
@ -52,6 +51,21 @@ static void deplist_display(const char *title,
|
||||||
FREELIST(text);
|
FREELIST(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Turn a optdepends list into a text list.
|
||||||
|
* @param optdeps a list with items of type alpm_optdepend_t
|
||||||
|
*/
|
||||||
|
static void optdeplist_display(const char *title,
|
||||||
|
alpm_list_t *optdeps)
|
||||||
|
{
|
||||||
|
alpm_list_t *i, *text = NULL;
|
||||||
|
for(i = optdeps; i; i = alpm_list_next(i)) {
|
||||||
|
alpm_depend_t *optdep = i->data;
|
||||||
|
text = alpm_list_add(text, alpm_dep_compute_string(optdep));
|
||||||
|
}
|
||||||
|
list_display_linebreak(title, text);
|
||||||
|
FREELIST(text);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display the details of a package.
|
* Display the details of a package.
|
||||||
* Extra information entails 'required by' info for sync packages and backup
|
* Extra information entails 'required by' info for sync packages and backup
|
||||||
|
@ -111,7 +125,7 @@ void dump_pkg_full(alpm_pkg_t *pkg, int extra)
|
||||||
list_display(_("Groups :"), alpm_pkg_get_groups(pkg));
|
list_display(_("Groups :"), alpm_pkg_get_groups(pkg));
|
||||||
deplist_display(_("Provides :"), alpm_pkg_get_provides(pkg));
|
deplist_display(_("Provides :"), alpm_pkg_get_provides(pkg));
|
||||||
deplist_display(_("Depends On :"), alpm_pkg_get_depends(pkg));
|
deplist_display(_("Depends On :"), alpm_pkg_get_depends(pkg));
|
||||||
list_display_linebreak(_("Optional Deps :"), alpm_pkg_get_optdepends(pkg));
|
optdeplist_display(_("Optional Deps :"), alpm_pkg_get_optdepends(pkg));
|
||||||
if(extra || from == PKG_FROM_LOCALDB) {
|
if(extra || from == PKG_FROM_LOCALDB) {
|
||||||
list_display(_("Required By :"), requiredby);
|
list_display(_("Required By :"), requiredby);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1151,32 +1151,87 @@ void print_packages(const alpm_list_t *packages)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper function for comparing strings using the
|
/**
|
||||||
* alpm "compare func" signature */
|
* Helper function for comparing depends using the alpm "compare func"
|
||||||
int str_cmp(const void *s1, const void *s2)
|
* signature. The function descends through the structure in the following
|
||||||
|
* comparison order: name, modifier (e.g., '>', '='), version, description.
|
||||||
|
* @param d1 the first depend structure
|
||||||
|
* @param d2 the second depend structure
|
||||||
|
* @return -1, 0, or 1 if first is <, ==, or > second
|
||||||
|
*/
|
||||||
|
static int depend_cmp(const void *d1, const void *d2)
|
||||||
{
|
{
|
||||||
return strcmp(s1, s2);
|
const alpm_depend_t *dep1 = d1;
|
||||||
|
const alpm_depend_t *dep2 = d2;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = strcmp(dep1->name, dep2->name);
|
||||||
|
if(ret == 0) {
|
||||||
|
ret = dep1->mod - dep2->mod;
|
||||||
|
}
|
||||||
|
if(ret == 0) {
|
||||||
|
if(dep1->version && dep2->version) {
|
||||||
|
ret = strcmp(dep1->version, dep2->version);
|
||||||
|
} else if(!dep1->version && dep2->version) {
|
||||||
|
ret = -1;
|
||||||
|
} else if(dep1->version && !dep2->version) {
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ret == 0) {
|
||||||
|
if(dep1->desc && dep2->desc) {
|
||||||
|
ret = strcmp(dep1->desc, dep2->desc);
|
||||||
|
} else if(!dep1->desc && dep2->desc) {
|
||||||
|
ret = -1;
|
||||||
|
} else if(dep1->desc && !dep2->desc) {
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_new_optdepends(alpm_pkg_t *oldpkg, alpm_pkg_t *newpkg)
|
void display_new_optdepends(alpm_pkg_t *oldpkg, alpm_pkg_t *newpkg)
|
||||||
{
|
{
|
||||||
alpm_list_t *old = alpm_pkg_get_optdepends(oldpkg);
|
alpm_list_t *i, *old, *new, *optdeps, *optstrings = NULL;
|
||||||
alpm_list_t *new = alpm_pkg_get_optdepends(newpkg);
|
|
||||||
alpm_list_t *optdeps = alpm_list_diff(new,old,str_cmp);
|
old = alpm_pkg_get_optdepends(oldpkg);
|
||||||
if(optdeps) {
|
new = alpm_pkg_get_optdepends(newpkg);
|
||||||
printf(_("New optional dependencies for %s\n"), alpm_pkg_get_name(newpkg));
|
optdeps = alpm_list_diff(new, old, depend_cmp);
|
||||||
list_display_linebreak(" ", optdeps);
|
|
||||||
|
/* turn optdepends list into a text list */
|
||||||
|
for(i = optdeps; i; i = alpm_list_next(i)) {
|
||||||
|
alpm_depend_t *optdep = i->data;
|
||||||
|
optstrings = alpm_list_add(optstrings, alpm_dep_compute_string(optdep));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(optstrings) {
|
||||||
|
printf(_("New optional dependencies for %s\n"), alpm_pkg_get_name(newpkg));
|
||||||
|
list_display_linebreak(" ", optstrings);
|
||||||
|
}
|
||||||
|
|
||||||
alpm_list_free(optdeps);
|
alpm_list_free(optdeps);
|
||||||
|
FREELIST(optstrings);
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_optdepends(alpm_pkg_t *pkg)
|
void display_optdepends(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
alpm_list_t *optdeps = alpm_pkg_get_optdepends(pkg);
|
alpm_list_t *i, *optdeps, *optstrings = NULL;
|
||||||
if(optdeps) {
|
|
||||||
printf(_("Optional dependencies for %s\n"), alpm_pkg_get_name(pkg));
|
optdeps = alpm_pkg_get_optdepends(pkg);
|
||||||
list_display_linebreak(" ", optdeps);
|
|
||||||
|
/* turn optdepends list into a text list */
|
||||||
|
for(i = optdeps; i; i = alpm_list_next(i)) {
|
||||||
|
alpm_depend_t *optdep = i->data;
|
||||||
|
optstrings = alpm_list_add(optstrings, alpm_dep_compute_string(optdep));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(optstrings) {
|
||||||
|
printf(_("Optional dependencies for %s\n"), alpm_pkg_get_name(pkg));
|
||||||
|
list_display_linebreak(" ", optstrings);
|
||||||
|
}
|
||||||
|
|
||||||
|
FREELIST(optstrings);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void display_repo_list(const char *dbname, alpm_list_t *list)
|
static void display_repo_list(const char *dbname, alpm_list_t *list)
|
||||||
|
|
Loading…
Add table
Reference in a new issue