libalpm: Parse and write PKGBASEs

This commit adds support to libalpm to parse the pkgbase present in
packages .PKGINFO files, writing the PKGBASE to the %BASE% section of
the local DBs desc files and for parsing it again when loading the local
DB

Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Johannes Löthberg 2014-12-22 15:11:38 +01:00 committed by Allan McRae
parent fda599df37
commit 9f527d2de4
5 changed files with 12 additions and 1 deletions

View file

@ -701,6 +701,8 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
_alpm_log(db->handle, ALPM_LOG_ERROR, _("%s database is inconsistent: version " _alpm_log(db->handle, ALPM_LOG_ERROR, _("%s database is inconsistent: version "
"mismatch on package %s\n"), db->treename, info->name); "mismatch on package %s\n"), db->treename, info->name);
} }
} else if(strcmp(line, "%BASE%") == 0) {
READ_AND_STORE(info->base);
} else if(strcmp(line, "%DESC%") == 0) { } else if(strcmp(line, "%DESC%") == 0) {
READ_AND_STORE(info->desc); READ_AND_STORE(info->desc);
} else if(strcmp(line, "%GROUPS%") == 0) { } else if(strcmp(line, "%GROUPS%") == 0) {
@ -905,6 +907,10 @@ int _alpm_local_db_write(alpm_db_t *db, alpm_pkg_t *info, alpm_dbinfrq_t inforeq
free(path); free(path);
fprintf(fp, "%%NAME%%\n%s\n\n" fprintf(fp, "%%NAME%%\n%s\n\n"
"%%VERSION%%\n%s\n\n", info->name, info->version); "%%VERSION%%\n%s\n\n", info->name, info->version);
if(info->base) {
fprintf(fp, "%%BASE%%\n"
"%s\n\n", info->base);
}
if(info->desc) { if(info->desc) {
fprintf(fp, "%%DESC%%\n" fprintf(fp, "%%DESC%%\n"
"%s\n\n", info->desc); "%s\n\n", info->desc);

View file

@ -193,7 +193,7 @@ static int parse_descfile(alpm_handle_t *handle, struct archive *a, alpm_pkg_t *
STRDUP(newpkg->name, ptr, return -1); STRDUP(newpkg->name, ptr, return -1);
newpkg->name_hash = _alpm_hash_sdbm(newpkg->name); newpkg->name_hash = _alpm_hash_sdbm(newpkg->name);
} else if(strcmp(key, "pkgbase") == 0) { } else if(strcmp(key, "pkgbase") == 0) {
/* not used atm */ STRDUP(newpkg->base, ptr, return -1);
} else if(strcmp(key, "pkgver") == 0) { } else if(strcmp(key, "pkgver") == 0) {
STRDUP(newpkg->version, ptr, return -1); STRDUP(newpkg->version, ptr, return -1);
} else if(strcmp(key, "basever") == 0) { } else if(strcmp(key, "basever") == 0) {

View file

@ -614,6 +614,8 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
if(_alpm_validate_filename(db, pkg->name, pkg->filename) < 0) { if(_alpm_validate_filename(db, pkg->name, pkg->filename) < 0) {
return -1; return -1;
} }
} else if(strcmp(line, "%BASE%") == 0) {
READ_AND_STORE(pkg->base);
} else if(strcmp(line, "%DESC%") == 0) { } else if(strcmp(line, "%DESC%") == 0) {
READ_AND_STORE(pkg->desc); READ_AND_STORE(pkg->desc);
} else if(strcmp(line, "%GROUPS%") == 0) { } else if(strcmp(line, "%GROUPS%") == 0) {

View file

@ -566,6 +566,7 @@ int _alpm_pkg_dup(alpm_pkg_t *pkg, alpm_pkg_t **new_ptr)
newpkg->name_hash = pkg->name_hash; newpkg->name_hash = pkg->name_hash;
STRDUP(newpkg->filename, pkg->filename, goto cleanup); STRDUP(newpkg->filename, pkg->filename, goto cleanup);
STRDUP(newpkg->base, pkg->base, goto cleanup);
STRDUP(newpkg->name, pkg->name, goto cleanup); STRDUP(newpkg->name, pkg->name, goto cleanup);
STRDUP(newpkg->version, pkg->version, goto cleanup); STRDUP(newpkg->version, pkg->version, goto cleanup);
STRDUP(newpkg->desc, pkg->desc, goto cleanup); STRDUP(newpkg->desc, pkg->desc, goto cleanup);
@ -641,6 +642,7 @@ void _alpm_pkg_free(alpm_pkg_t *pkg)
} }
FREE(pkg->filename); FREE(pkg->filename);
FREE(pkg->base);
FREE(pkg->name); FREE(pkg->name);
FREE(pkg->version); FREE(pkg->version);
FREE(pkg->desc); FREE(pkg->desc);

View file

@ -85,6 +85,7 @@ extern struct pkg_operations default_pkg_ops;
struct __alpm_pkg_t { struct __alpm_pkg_t {
unsigned long name_hash; unsigned long name_hash;
char *filename; char *filename;
char *base;
char *name; char *name;
char *version; char *version;
char *desc; char *desc;