sync_commit: refactor out validate_deltas
More stuff going on in the pre-committing stage that can be in a static method to make things a bit more clear. Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
2df1534b78
commit
1cf79eb8c8
1 changed files with 53 additions and 50 deletions
|
@ -651,6 +651,7 @@ static int apply_deltas(pmtrans_t *trans)
|
||||||
if(retval != 0) {
|
if(retval != 0) {
|
||||||
/* one delta failed for this package, cancel the remaining ones */
|
/* one delta failed for this package, cancel the remaining ones */
|
||||||
EVENT(trans, PM_TRANS_EVT_DELTA_PATCH_FAILED, NULL, NULL);
|
EVENT(trans, PM_TRANS_EVT_DELTA_PATCH_FAILED, NULL, NULL);
|
||||||
|
pm_errno = PM_ERR_DLT_PATCHFAILED;
|
||||||
ret = 1;
|
ret = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -687,6 +688,44 @@ static int test_md5sum(pmtrans_t *trans, const char *filepath,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int validate_deltas(pmtrans_t *trans, alpm_list_t *deltas,
|
||||||
|
alpm_list_t **data)
|
||||||
|
{
|
||||||
|
int errors = 0, ret = 0;
|
||||||
|
alpm_list_t *i;
|
||||||
|
|
||||||
|
if(!deltas) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check integrity of deltas */
|
||||||
|
EVENT(trans, PM_TRANS_EVT_DELTA_INTEGRITY_START, NULL, NULL);
|
||||||
|
|
||||||
|
for(i = deltas; i; i = i->next) {
|
||||||
|
pmdelta_t *d = alpm_list_getdata(i);
|
||||||
|
const char *filename = alpm_delta_get_filename(d);
|
||||||
|
char *filepath = _alpm_filecache_find(filename);
|
||||||
|
const char *md5sum = alpm_delta_get_md5sum(d);
|
||||||
|
|
||||||
|
if(test_md5sum(trans, filepath, md5sum) != 0) {
|
||||||
|
errors++;
|
||||||
|
*data = alpm_list_add(*data, strdup(filename));
|
||||||
|
}
|
||||||
|
FREE(filepath);
|
||||||
|
}
|
||||||
|
if(errors) {
|
||||||
|
pm_errno = PM_ERR_DLT_INVALID;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
EVENT(trans, PM_TRANS_EVT_DELTA_INTEGRITY_DONE, NULL, NULL);
|
||||||
|
|
||||||
|
/* Use the deltas to generate the packages */
|
||||||
|
EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_START, NULL, NULL);
|
||||||
|
ret = apply_deltas(trans);
|
||||||
|
EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_DONE, NULL, NULL);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int download_files(pmtrans_t *trans, alpm_list_t **deltas)
|
static int download_files(pmtrans_t *trans, alpm_list_t **deltas)
|
||||||
{
|
{
|
||||||
const char *cachedir;
|
const char *cachedir;
|
||||||
|
@ -797,52 +836,22 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
alpm_list_t *i;
|
alpm_list_t *i;
|
||||||
alpm_list_t *deltas = NULL;
|
alpm_list_t *deltas = NULL;
|
||||||
size_t numtargs, current = 0, replaces = 0;
|
size_t numtargs, current = 0, replaces = 0;
|
||||||
int errors = 0;
|
int errors;
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
ALPM_LOG_FUNC;
|
ALPM_LOG_FUNC;
|
||||||
|
|
||||||
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));
|
||||||
|
|
||||||
if(download_files(trans, &deltas)) {
|
if(download_files(trans, &deltas)) {
|
||||||
goto error;
|
alpm_list_free(deltas);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we have deltas to work with */
|
if(validate_deltas(trans, deltas, data)) {
|
||||||
if(handle->usedelta && deltas) {
|
alpm_list_free(deltas);
|
||||||
int ret = 0;
|
return -1;
|
||||||
errors = 0;
|
|
||||||
/* Check integrity of deltas */
|
|
||||||
EVENT(trans, PM_TRANS_EVT_DELTA_INTEGRITY_START, NULL, NULL);
|
|
||||||
|
|
||||||
for(i = deltas; i; i = i->next) {
|
|
||||||
pmdelta_t *d = alpm_list_getdata(i);
|
|
||||||
const char *filename = alpm_delta_get_filename(d);
|
|
||||||
char *filepath = _alpm_filecache_find(filename);
|
|
||||||
const char *md5sum = alpm_delta_get_md5sum(d);
|
|
||||||
|
|
||||||
if(test_md5sum(trans, filepath, md5sum) != 0) {
|
|
||||||
errors++;
|
|
||||||
*data = alpm_list_add(*data, strdup(filename));
|
|
||||||
}
|
|
||||||
FREE(filepath);
|
|
||||||
}
|
|
||||||
if(errors) {
|
|
||||||
pm_errno = PM_ERR_DLT_INVALID;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
EVENT(trans, PM_TRANS_EVT_DELTA_INTEGRITY_DONE, NULL, NULL);
|
|
||||||
|
|
||||||
/* Use the deltas to generate the packages */
|
|
||||||
EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_START, NULL, NULL);
|
|
||||||
ret = apply_deltas(trans);
|
|
||||||
EVENT(trans, PM_TRANS_EVT_DELTA_PATCHES_DONE, NULL, NULL);
|
|
||||||
|
|
||||||
if(ret) {
|
|
||||||
pm_errno = PM_ERR_DLT_PATCHFAILED;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
alpm_list_free(deltas);
|
||||||
|
|
||||||
/* Check integrity of packages */
|
/* Check integrity of packages */
|
||||||
numtargs = alpm_list_count(trans->add);
|
numtargs = alpm_list_count(trans->add);
|
||||||
|
@ -909,13 +918,11 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
|
|
||||||
|
|
||||||
if(errors) {
|
if(errors) {
|
||||||
pm_errno = PM_ERR_PKG_INVALID;
|
RET_ERR(PM_ERR_PKG_INVALID, -1);
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(trans->flags & PM_TRANS_FLAG_DOWNLOADONLY) {
|
if(trans->flags & PM_TRANS_FLAG_DOWNLOADONLY) {
|
||||||
ret = 0;
|
return 0;
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trans->state = STATE_COMMITING;
|
trans->state = STATE_COMMITING;
|
||||||
|
@ -930,14 +937,13 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
alpm_list_t *conflict = _alpm_db_find_fileconflicts(db_local, trans,
|
alpm_list_t *conflict = _alpm_db_find_fileconflicts(db_local, trans,
|
||||||
trans->add, trans->remove);
|
trans->add, trans->remove);
|
||||||
if(conflict) {
|
if(conflict) {
|
||||||
pm_errno = PM_ERR_FILE_CONFLICTS;
|
|
||||||
if(data) {
|
if(data) {
|
||||||
*data = conflict;
|
*data = conflict;
|
||||||
} else {
|
} else {
|
||||||
alpm_list_free_inner(conflict, (alpm_list_fn_free)_alpm_fileconflict_free);
|
alpm_list_free_inner(conflict, (alpm_list_fn_free)_alpm_fileconflict_free);
|
||||||
alpm_list_free(conflict);
|
alpm_list_free(conflict);
|
||||||
}
|
}
|
||||||
goto error;
|
RET_ERR(PM_ERR_FILE_CONFLICTS, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
EVENT(trans, PM_TRANS_EVT_FILECONFLICTS_DONE, NULL, NULL);
|
EVENT(trans, PM_TRANS_EVT_FILECONFLICTS_DONE, NULL, NULL);
|
||||||
|
@ -950,7 +956,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
_alpm_log(PM_LOG_DEBUG, "checking available disk space\n");
|
_alpm_log(PM_LOG_DEBUG, "checking available disk space\n");
|
||||||
if(_alpm_check_diskspace(trans, handle->db_local) == -1) {
|
if(_alpm_check_diskspace(trans, handle->db_local) == -1) {
|
||||||
_alpm_log(PM_LOG_ERROR, "%s\n", _("not enough free disk space"));
|
_alpm_log(PM_LOG_ERROR, "%s\n", _("not enough free disk space"));
|
||||||
goto error;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
EVENT(trans, PM_TRANS_EVT_DISKSPACE_DONE, NULL, NULL);
|
EVENT(trans, PM_TRANS_EVT_DISKSPACE_DONE, NULL, NULL);
|
||||||
|
@ -962,7 +968,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
/* we want the frontend to be aware of commit details */
|
/* we want the frontend to be aware of commit details */
|
||||||
if(_alpm_remove_packages(trans, handle->db_local) == -1) {
|
if(_alpm_remove_packages(trans, handle->db_local) == -1) {
|
||||||
_alpm_log(PM_LOG_ERROR, _("could not commit removal transaction\n"));
|
_alpm_log(PM_LOG_ERROR, _("could not commit removal transaction\n"));
|
||||||
goto error;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -970,13 +976,10 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
_alpm_log(PM_LOG_DEBUG, "installing packages\n");
|
_alpm_log(PM_LOG_DEBUG, "installing packages\n");
|
||||||
if(_alpm_upgrade_packages(trans, handle->db_local) == -1) {
|
if(_alpm_upgrade_packages(trans, handle->db_local) == -1) {
|
||||||
_alpm_log(PM_LOG_ERROR, _("could not commit transaction\n"));
|
_alpm_log(PM_LOG_ERROR, _("could not commit transaction\n"));
|
||||||
goto error;
|
return -1;
|
||||||
}
|
}
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
error:
|
return 0;
|
||||||
alpm_list_free(deltas);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=2 sw=2 noet: */
|
/* vim: set ts=2 sw=2 noet: */
|
||||||
|
|
Loading…
Add table
Reference in a new issue