Skip to content

Commit

Permalink
xbps-rindex: add abi support.
Browse files Browse the repository at this point in the history
repodata can't contain packages with different ABIs.
  • Loading branch information
ericonr committed Sep 7, 2020
1 parent 9e0096a commit c12165c
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 4 deletions.
39 changes: 35 additions & 4 deletions bin/xbps-rindex/index-add.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,8 @@ index_add(struct xbps_handle *xhp, int args, int argmax, char **argv, bool force
xbps_dictionary_t idx, idxmeta, idxstage, binpkgd, curpkgd;
struct xbps_repo *repo = NULL, *stage = NULL;
struct stat st;
char *tmprepodir = NULL, *repodir = NULL, *rlockfname = NULL;
char *tmprepodir = NULL, *repodir = NULL, *rlockfname = NULL, *repo_abi = NULL;
bool new_repo = false;
int rv = 0, ret = 0, rlockfd = -1;

assert(argv);
Expand All @@ -230,9 +231,11 @@ index_add(struct xbps_handle *xhp, int args, int argmax, char **argv, bool force
if (repo) {
idx = xbps_dictionary_copy_mutable(repo->idx);
idxmeta = xbps_dictionary_copy_mutable(repo->idxmeta);
xbps_dictionary_get_cstring(idx, "abi", &repo_abi);
} else {
idx = xbps_dictionary_create();
idxmeta = NULL;
new_repo = true;
}
stage = xbps_repo_stage_open(xhp, repodir);
if (stage == NULL && errno != ENOENT) {
Expand All @@ -251,7 +254,7 @@ index_add(struct xbps_handle *xhp, int args, int argmax, char **argv, bool force
* Process all packages specified in argv.
*/
for (int i = args; i < argmax; i++) {
const char *arch = NULL, *pkg = argv[i];
const char *arch = NULL, *abi = NULL, *pkg = argv[i];
char *pkgver = NULL;
char sha256[XBPS_SHA256_SIZE];
char pkgname[XBPS_NAME_SIZE];
Expand All @@ -277,6 +280,34 @@ index_add(struct xbps_handle *xhp, int args, int argmax, char **argv, bool force
if (!xbps_pkg_name(pkgname, sizeof(pkgname), pkgver)) {
abort();
}
/*
* If creating a new index and package has abi field,
* set abi for repo. Otherwise, check if repo and package
* have the same abi value.
*/
xbps_dictionary_get_cstring_nocopy(binpkgd, "abi", &abi);
if (new_repo) {
if (abi) {
xbps_dictionary_set_cstring(idx, "abi", abi);
repo_abi = strdup(abi);
assert(repo_abi);
}
new_repo = false;
} else {
if (abi && repo_abi) {
if (strcmp(abi, repo_abi)) {
fprintf(stderr, "index: ignoring %s, unmatched abi (%s)\n", pkgver, abi);
xbps_object_release(binpkgd);
free(pkgver);
continue;
}
} else if ((abi && !repo_abi) || (!abi && repo_abi)) {
fprintf(stderr, "index: ignoring %s, unmatched abi (%s)\n", pkgver, abi ? abi : "empty");
xbps_object_release(binpkgd);
free(pkgver);
continue;
}
}
/*
* Check if this package exists already in the index, but first
* checking the version. If current package version is greater
Expand Down Expand Up @@ -397,8 +428,8 @@ index_add(struct xbps_handle *xhp, int args, int argmax, char **argv, bool force

xbps_repo_unlock(rlockfd, rlockfname);

if (tmprepodir)
free(tmprepodir);
free(tmprepodir);
free(repo_abi);

return rv;
}
72 changes: 72 additions & 0 deletions tests/xbps/xbps-rindex/add_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,81 @@ stage_resolve_bug_body() {
atf_check_equal $? 1
}

atf_test_case abi_mismatch

abi_mismatch_head() {
atf_set "descr" "xbps-rindex(1) -a: don't index package with different abi"
}

abi_mismatch_body() {
mkdir -p some_repo pkg_A pkg_B
touch pkg_A/file00 pkg_B/file01
cd some_repo
xbps-create -A noarch -n foo-1.0_1 -s "foo pkg" ../pkg_A
atf_check_equal $? 0
xbps-create -A noarch -n bar-1.1_1 -s "foo pkg" -a 1 ../pkg_B
atf_check_equal $? 0

xbps-rindex -d -a $PWD/*.xbps
atf_check_equal $? 0

cd ..
n="$(xbps-query -r root --repository=some_repo -s "" | wc -l)"
atf_check_equal $n 1
}

atf_test_case abi_mismatch_2

abi_mismatch_2_head() {
atf_set "descr" "xbps-rindex(1) -a: don't index package with different abi"
}

abi_mismatch_2_body() {
mkdir -p some_repo pkg_A pkg_B
touch pkg_A/file00 pkg_B/file01
cd some_repo
xbps-create -A noarch -n foo-1.0_1 -s "foo pkg" -a 2 ../pkg_A
atf_check_equal $? 0
xbps-create -A noarch -n bar-1.1_1 -s "foo pkg" -a 1 ../pkg_B
atf_check_equal $? 0

xbps-rindex -d -a $PWD/*.xbps
atf_check_equal $? 0

cd ..
n="$(xbps-query -r root --repository=some_repo -s "" | wc -l)"
atf_check_equal $n 1
}

atf_test_case abi_match

abi_match_head() {
atf_set "descr" "xbps-rindex(1) -a: index packages with matching abi"
}

abi_match_body() {
mkdir -p some_repo pkg_A pkg_B
touch pkg_A/file00 pkg_B/file01
cd some_repo
xbps-create -A noarch -n foo-1.0_1 -s "foo pkg" -a 1 ../pkg_A
atf_check_equal $? 0
xbps-create -A noarch -n bar-1.1_1 -s "foo pkg" -a 1 ../pkg_B
atf_check_equal $? 0

xbps-rindex -d -a $PWD/*.xbps
atf_check_equal $? 0

cd ..
n="$(xbps-query -r root --repository=some_repo -s "" | wc -l)"
atf_check_equal $n 2
}

atf_init_test_cases() {
atf_add_test_case update
atf_add_test_case revert
atf_add_test_case stage
atf_add_test_case stage_resolve_bug
atf_add_test_case abi_mismatch
atf_add_test_case abi_mismatch_2
atf_add_test_case abi_match
}

0 comments on commit c12165c

Please sign in to comment.