summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libalpm/sync.c123
1 files changed, 69 insertions, 54 deletions
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index 04662aad..2092912e 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -905,51 +905,17 @@ static int download_files(alpm_handle_t *handle, alpm_list_t **deltas)
return errors;
}
-int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
+static int check_validity(alpm_handle_t *handle, alpm_list_t **data,
+ size_t total, size_t total_bytes)
{
+ size_t current = 0, current_bytes = 0;
+ int errors = 0;
alpm_list_t *i;
- alpm_list_t *deltas = NULL;
- size_t numtargs, current, replaces = 0;
- size_t current_bytes, total_bytes;
- int errors;
- alpm_trans_t *trans = handle->trans;
-
- if(download_files(handle, &deltas)) {
- alpm_list_free(deltas);
- return -1;
- }
-
- if(validate_deltas(handle, deltas, data)) {
- alpm_list_free(deltas);
- return -1;
- }
- alpm_list_free(deltas);
-
- /* Use the deltas to generate the packages */
- if(apply_deltas(handle)) {
- return -1;
- }
-
- /* get the total size of all packages so we can adjust the progress bar more
- * realistically if there are small and huge packages involved */
- current = total_bytes = 0;
- for(i = trans->add; i; i = i->next, current++) {
- alpm_pkg_t *spkg = i->data;
- if(spkg->origin != PKG_FROM_FILE) {
- total_bytes += spkg->size;
- }
- }
- /* this can only happen maliciously */
- total_bytes = total_bytes ? total_bytes : 1;
/* Check integrity of packages */
- numtargs = alpm_list_count(trans->add);
EVENT(handle, ALPM_EVENT_INTEGRITY_START, NULL, NULL);
- current = current_bytes = 0;
- errors = 0;
-
- for(i = trans->add; i; i = i->next, current++) {
+ for(i = handle->trans->add; i; i = i->next, current++) {
alpm_pkg_t *spkg = i->data;
char *filepath;
alpm_siglevel_t level;
@@ -957,7 +923,7 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
int percent = (int)(((double)current_bytes / total_bytes) * 100);
PROGRESS(handle, ALPM_PROGRESS_INTEGRITY_START, "", percent,
- numtargs, current);
+ total, current);
if(spkg->origin == PKG_FROM_FILE) {
continue; /* pkg_load() has been already called, this package is valid */
}
@@ -978,7 +944,7 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
}
PROGRESS(handle, ALPM_PROGRESS_INTEGRITY_START, "", 100,
- numtargs, current);
+ total, current);
EVENT(handle, ALPM_EVENT_INTEGRITY_DONE, NULL, NULL);
if(errors) {
@@ -988,24 +954,26 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
return -1;
}
- if(trans->flags & ALPM_TRANS_FLAG_DOWNLOADONLY) {
- return 0;
- }
+ return 0;
+}
+
+static int load_packages(alpm_handle_t *handle, alpm_list_t **data,
+ size_t total, size_t total_bytes)
+{
+ size_t current = 0, current_bytes = 0;
+ int errors = 0;
+ alpm_list_t *i;
/* load packages from disk now that they are known-valid */
- numtargs = alpm_list_count(trans->add);
EVENT(handle, ALPM_EVENT_LOAD_START, NULL, NULL);
- current = current_bytes = 0;
- errors = 0;
-
- for(i = trans->add; i; i = i->next, current++) {
+ for(i = handle->trans->add; i; i = i->next, current++) {
alpm_pkg_t *spkg = i->data;
char *filepath;
int percent = (int)(((double)current_bytes / total_bytes) * 100);
PROGRESS(handle, ALPM_PROGRESS_LOAD_START, "", percent,
- numtargs, current);
+ total, current);
if(spkg->origin == PKG_FROM_FILE) {
continue; /* pkg_load() has been already called, this package is valid */
}
@@ -1032,7 +1000,7 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
}
PROGRESS(handle, ALPM_PROGRESS_LOAD_START, "", 100,
- numtargs, current);
+ total, current);
EVENT(handle, ALPM_EVENT_LOAD_DONE, NULL, NULL);
if(errors) {
@@ -1042,9 +1010,56 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
return -1;
}
- trans->state = STATE_COMMITING;
+ return 0;
+}
- replaces = alpm_list_count(trans->remove);
+int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
+{
+ alpm_list_t *i, *deltas = NULL;
+ size_t total = 0, total_bytes = 0;
+ alpm_trans_t *trans = handle->trans;
+
+ if(download_files(handle, &deltas)) {
+ alpm_list_free(deltas);
+ return -1;
+ }
+
+ if(validate_deltas(handle, deltas, data)) {
+ alpm_list_free(deltas);
+ return -1;
+ }
+ alpm_list_free(deltas);
+
+ /* Use the deltas to generate the packages */
+ if(apply_deltas(handle)) {
+ return -1;
+ }
+
+ /* get the total size of all packages so we can adjust the progress bar more
+ * realistically if there are small and huge packages involved */
+ for(i = trans->add; i; i = i->next) {
+ alpm_pkg_t *spkg = i->data;
+ if(spkg->origin != PKG_FROM_FILE) {
+ total_bytes += spkg->size;
+ }
+ total++;
+ }
+ /* this can only happen maliciously */
+ total_bytes = total_bytes ? total_bytes : 1;
+
+ if(check_validity(handle, data, total, total_bytes)) {
+ return -1;
+ }
+
+ if(trans->flags & ALPM_TRANS_FLAG_DOWNLOADONLY) {
+ return 0;
+ }
+
+ if(load_packages(handle, data, total, total_bytes)) {
+ return -1;
+ }
+
+ trans->state = STATE_COMMITING;
/* fileconflict check */
if(!(trans->flags & ALPM_TRANS_FLAG_FORCE)) {
@@ -1080,7 +1095,7 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
}
/* remove conflicting and to-be-replaced packages */
- if(replaces) {
+ if(trans->remove) {
_alpm_log(handle, ALPM_LOG_DEBUG, "removing conflicting and to-be-replaced packages\n");
/* we want the frontend to be aware of commit details */
if(_alpm_remove_packages(handle, 0) == -1) {