Generate transaction pkg count stats in the transaction dictionary.
This removes a chunk in frontends to compute number of installed, updated, configured and removed pkgs in transaction.
This commit is contained in:
@ -43,10 +43,10 @@ struct transaction {
|
|||||||
prop_object_iterator_t iter;
|
prop_object_iterator_t iter;
|
||||||
bool yes;
|
bool yes;
|
||||||
bool only_show;
|
bool only_show;
|
||||||
size_t inst_pkgcnt;
|
uint32_t inst_pkgcnt;
|
||||||
size_t up_pkgcnt;
|
uint32_t up_pkgcnt;
|
||||||
size_t cf_pkgcnt;
|
uint32_t cf_pkgcnt;
|
||||||
size_t rm_pkgcnt;
|
uint32_t rm_pkgcnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -201,55 +201,36 @@ show_package_list(prop_object_iterator_t iter, const char *match)
|
|||||||
static int
|
static int
|
||||||
show_transaction_sizes(struct transaction *trans)
|
show_transaction_sizes(struct transaction *trans)
|
||||||
{
|
{
|
||||||
prop_object_t obj;
|
|
||||||
uint64_t dlsize = 0, instsize = 0;
|
uint64_t dlsize = 0, instsize = 0;
|
||||||
const char *tract;
|
|
||||||
char size[8];
|
char size[8];
|
||||||
bool trans_inst, trans_up, trans_conf, trans_rm;
|
|
||||||
|
|
||||||
trans_inst = trans_up = trans_conf = trans_rm = false;
|
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(trans->iter))) {
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "transaction", &tract);
|
|
||||||
if (strcmp(tract, "install") == 0) {
|
|
||||||
trans->inst_pkgcnt++;
|
|
||||||
trans_inst = true;
|
|
||||||
} else if (strcmp(tract, "update") == 0) {
|
|
||||||
trans->up_pkgcnt++;
|
|
||||||
trans_up = true;
|
|
||||||
} else if (strcmp(tract, "configure") == 0) {
|
|
||||||
trans->cf_pkgcnt++;
|
|
||||||
trans_conf = true;
|
|
||||||
} else if (strcmp(tract, "remove") == 0) {
|
|
||||||
trans->rm_pkgcnt++;
|
|
||||||
trans_rm = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
prop_object_iterator_reset(trans->iter);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Show the list of packages that will be installed.
|
* Show the list of packages that will be installed.
|
||||||
*/
|
*/
|
||||||
if (trans_inst) {
|
if (prop_dictionary_get_uint32(trans->dict, "total-install-pkgs",
|
||||||
printf("%zu package%s will be installed:\n\n",
|
&trans->inst_pkgcnt)) {
|
||||||
|
printf("%u package%s will be installed:\n\n",
|
||||||
trans->inst_pkgcnt, trans->inst_pkgcnt == 1 ? "" : "s");
|
trans->inst_pkgcnt, trans->inst_pkgcnt == 1 ? "" : "s");
|
||||||
show_package_list(trans->iter, "install");
|
show_package_list(trans->iter, "install");
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
}
|
}
|
||||||
if (trans_up) {
|
if (prop_dictionary_get_uint32(trans->dict, "total-update-pkgs",
|
||||||
printf("%zu package%s will be updated:\n\n",
|
&trans->up_pkgcnt)) {
|
||||||
|
printf("%u package%s will be updated:\n\n",
|
||||||
trans->up_pkgcnt, trans->up_pkgcnt == 1 ? "" : "s");
|
trans->up_pkgcnt, trans->up_pkgcnt == 1 ? "" : "s");
|
||||||
show_package_list(trans->iter, "update");
|
show_package_list(trans->iter, "update");
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
}
|
}
|
||||||
if (trans_conf) {
|
if (prop_dictionary_get_uint32(trans->dict, "total-configure-pkgs",
|
||||||
printf("%zu package%s will be configured:\n\n",
|
&trans->cf_pkgcnt)) {
|
||||||
|
printf("%u package%s will be configured:\n\n",
|
||||||
trans->cf_pkgcnt, trans->cf_pkgcnt == 1 ? "" : "s");
|
trans->cf_pkgcnt, trans->cf_pkgcnt == 1 ? "" : "s");
|
||||||
show_package_list(trans->iter, "configure");
|
show_package_list(trans->iter, "configure");
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
}
|
}
|
||||||
if (trans_rm) {
|
if (prop_dictionary_get_uint32(trans->dict, "total-remove-pkgs",
|
||||||
printf("%zu package%s will be removed:\n\n",
|
&trans->rm_pkgcnt)) {
|
||||||
|
printf("%u package%s will be removed:\n\n",
|
||||||
trans->rm_pkgcnt, trans->rm_pkgcnt == 1 ? "" : "s");
|
trans->rm_pkgcnt, trans->rm_pkgcnt == 1 ? "" : "s");
|
||||||
show_package_list(trans->iter, "remove");
|
show_package_list(trans->iter, "remove");
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
@ -421,7 +402,7 @@ exec_transaction(struct transaction *trans)
|
|||||||
/*
|
/*
|
||||||
* Remove packages to be replaced.
|
* Remove packages to be replaced.
|
||||||
*/
|
*/
|
||||||
if (trans->rm_pkgcnt > 0) {
|
if (trans->rm_pkgcnt) {
|
||||||
printf("\n[*] Removing packages to be replaced ...\n");
|
printf("\n[*] Removing packages to be replaced ...\n");
|
||||||
while ((obj = prop_object_iterator_next(trans->iter)) != NULL) {
|
while ((obj = prop_object_iterator_next(trans->iter)) != NULL) {
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "transaction",
|
prop_dictionary_get_cstring_nocopy(obj, "transaction",
|
||||||
@ -461,7 +442,7 @@ exec_transaction(struct transaction *trans)
|
|||||||
/*
|
/*
|
||||||
* Configure pending packages.
|
* Configure pending packages.
|
||||||
*/
|
*/
|
||||||
if (trans->cf_pkgcnt > 0) {
|
if (trans->cf_pkgcnt) {
|
||||||
printf("\n[*] Reconfigure unpacked packages ...\n");
|
printf("\n[*] Reconfigure unpacked packages ...\n");
|
||||||
while ((obj = prop_object_iterator_next(trans->iter)) != NULL) {
|
while ((obj = prop_object_iterator_next(trans->iter)) != NULL) {
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "transaction",
|
prop_dictionary_get_cstring_nocopy(obj, "transaction",
|
||||||
@ -574,8 +555,9 @@ exec_transaction(struct transaction *trans)
|
|||||||
}
|
}
|
||||||
trans->cf_pkgcnt++;
|
trans->cf_pkgcnt++;
|
||||||
}
|
}
|
||||||
printf("\nxbps-bin: %zu installed, %zu updated, "
|
|
||||||
"%zu configured, %zu removed.\n", trans->inst_pkgcnt,
|
printf("\nxbps-bin: %u installed, %u updated, "
|
||||||
|
"%u configured, %u removed.\n", trans->inst_pkgcnt,
|
||||||
trans->up_pkgcnt, trans->cf_pkgcnt, trans->rm_pkgcnt);
|
trans->up_pkgcnt, trans->cf_pkgcnt, trans->rm_pkgcnt);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -100,24 +100,72 @@ create_transaction_missingdeps(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
compute_transaction_sizes(void)
|
compute_transaction_stats(void)
|
||||||
{
|
{
|
||||||
prop_object_iterator_t iter;
|
prop_object_iterator_t iter;
|
||||||
prop_object_t obj;
|
prop_object_t obj;
|
||||||
uint64_t tsize = 0, dlsize = 0, instsize = 0;
|
uint64_t tsize, dlsize, instsize;
|
||||||
|
uint32_t inst_pkgcnt, up_pkgcnt, cf_pkgcnt, rm_pkgcnt;
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
const char *tract;
|
const char *tract;
|
||||||
|
|
||||||
|
inst_pkgcnt = up_pkgcnt = cf_pkgcnt = rm_pkgcnt = 0;
|
||||||
|
tsize = dlsize = instsize = 0;
|
||||||
|
|
||||||
iter = xbps_array_iter_from_dict(transd, "packages");
|
iter = xbps_array_iter_from_dict(transd, "packages");
|
||||||
if (iter == NULL)
|
if (iter == NULL)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
|
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
||||||
|
/*
|
||||||
|
* Count number of pkgs to be removed, configured,
|
||||||
|
* installed and updated.
|
||||||
|
*/
|
||||||
|
prop_dictionary_get_cstring_nocopy(obj, "transaction", &tract);
|
||||||
|
if (strcmp(tract, "install") == 0)
|
||||||
|
inst_pkgcnt++;
|
||||||
|
else if (strcmp(tract, "update") == 0)
|
||||||
|
up_pkgcnt++;
|
||||||
|
else if (strcmp(tract, "configure") == 0)
|
||||||
|
cf_pkgcnt++;
|
||||||
|
else if (strcmp(tract, "remove") == 0)
|
||||||
|
rm_pkgcnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inst_pkgcnt &&
|
||||||
|
!prop_dictionary_set_uint32(transd, "total-install-pkgs",
|
||||||
|
inst_pkgcnt)) {
|
||||||
|
rv = EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (up_pkgcnt &&
|
||||||
|
!prop_dictionary_set_uint32(transd, "total-update-pkgs",
|
||||||
|
up_pkgcnt)) {
|
||||||
|
rv = EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (cf_pkgcnt &&
|
||||||
|
!prop_dictionary_set_uint32(transd, "total-configure-pkgs",
|
||||||
|
cf_pkgcnt)) {
|
||||||
|
rv = EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (rm_pkgcnt &&
|
||||||
|
!prop_dictionary_set_uint32(transd, "total-remove-pkgs",
|
||||||
|
rm_pkgcnt)) {
|
||||||
|
rv = EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
prop_object_iterator_reset(iter);
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "transaction", &tract);
|
prop_dictionary_get_cstring_nocopy(obj, "transaction", &tract);
|
||||||
/*
|
/*
|
||||||
* Skip pkgs that need to be configured.
|
* Only process pkgs to be installed or updated.
|
||||||
*/
|
*/
|
||||||
if (strcmp(tract, "configure") == 0)
|
if ((strcmp(tract, "configure") == 0) ||
|
||||||
|
(strcmp(tract, "remove") == 0))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
prop_dictionary_get_uint64(obj, "filename-size", &tsize);
|
prop_dictionary_get_uint64(obj, "filename-size", &tsize);
|
||||||
@ -197,10 +245,11 @@ xbps_transaction_prepare(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Add total transaction installed/download sizes
|
* Add transaction stats for total download/installed size,
|
||||||
* to the transaction dictionary.
|
* number of packages to be installed, updated, configured
|
||||||
|
* and removed to the transaction dictionary.
|
||||||
*/
|
*/
|
||||||
if ((rv = compute_transaction_sizes()) != 0) {
|
if ((rv = compute_transaction_stats()) != 0) {
|
||||||
errno = rv;
|
errno = rv;
|
||||||
prop_object_release(transd);
|
prop_object_release(transd);
|
||||||
prop_object_release(trans_mdeps);
|
prop_object_release(trans_mdeps);
|
||||||
|
Reference in New Issue
Block a user