diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libalpm/add.c | 61 | ||||
| -rw-r--r-- | lib/libalpm/alpm.h | 20 | 
2 files changed, 48 insertions, 33 deletions
| diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index f70e2cb1..1d9db602 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -464,10 +464,13 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,  		size_t pkg_current, size_t pkg_count)  {  	int i, ret = 0, errors = 0; -	int is_upgrade; +	int is_upgrade = 0;  	alpm_pkg_t *oldpkg = NULL;  	alpm_db_t *db = handle->db_local;  	alpm_trans_t *trans = handle->trans; +	alpm_progress_t event = ALPM_PROGRESS_ADD_START; +	alpm_event_t done = ALPM_EVENT_ADD_DONE, start = ALPM_EVENT_ADD_START; +	const char *log_msg = "adding";  	const char *pkgfile;  	ASSERT(trans != NULL, return -1); @@ -475,6 +478,23 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,  	/* see if this is an upgrade. if so, remove the old package first */  	alpm_pkg_t *local = _alpm_db_get_pkgfromcache(db, newpkg->name);  	if(local) { +		int cmp = _alpm_pkg_compare_versions(newpkg, local); +		if(cmp < 0) { +			log_msg = "downgrading"; +			event = ALPM_PROGRESS_DOWNGRADE_START; +			start = ALPM_EVENT_DOWNGRADE_START; +			done = ALPM_EVENT_DOWNGRADE_DONE; +		} else if(cmp == 0) { +			log_msg = "reinstalling"; +			event = ALPM_PROGRESS_REINSTALL_START; +			start = ALPM_EVENT_REINSTALL_START; +			done = ALPM_EVENT_REINSTALL_DONE; +		} else { +			log_msg = "upgrading"; +			event = ALPM_PROGRESS_UPGRADE_START; +			start = ALPM_EVENT_UPGRADE_START; +			done = ALPM_EVENT_UPGRADE_DONE; +		}  		is_upgrade = 1;  		/* we'll need to save some record for backup checks later */ @@ -485,17 +505,14 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,  		/* copy over the install reason */  		newpkg->reason = alpm_pkg_get_reason(local); - -		EVENT(handle, ALPM_EVENT_UPGRADE_START, newpkg, local); -	} else { -		is_upgrade = 0; -		EVENT(handle, ALPM_EVENT_ADD_START, newpkg, NULL);  	} +	EVENT(handle, start, newpkg, local); +  	pkgfile = newpkg->origin_data.file;  	_alpm_log(handle, ALPM_LOG_DEBUG, "%s package %s-%s\n", -			is_upgrade ? "upgrading" : "adding", newpkg->name, newpkg->version); +			log_msg, newpkg->name, newpkg->version);  		/* pre_install/pre_upgrade scriptlet */  	if(alpm_pkg_has_scriptlet(newpkg) &&  			!(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) { @@ -564,13 +581,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,  		}  		/* call PROGRESS once with 0 percent, as we sort-of skip that here */ -		if(is_upgrade) { -			PROGRESS(handle, ALPM_PROGRESS_UPGRADE_START, -					newpkg->name, 0, pkg_count, pkg_current); -		} else { -			PROGRESS(handle, ALPM_PROGRESS_ADD_START, -					newpkg->name, 0, pkg_count, pkg_current); -		} +		PROGRESS(handle, event, newpkg->name, 0, pkg_count, pkg_current);  		for(i = 0; archive_read_next_header(archive, &entry) == ARCHIVE_OK; i++) {  			int percent; @@ -588,13 +599,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,  				percent = 0;  			} -			if(is_upgrade) { -				PROGRESS(handle, ALPM_PROGRESS_UPGRADE_START, -						newpkg->name, percent, pkg_count, pkg_current); -			} else { -				PROGRESS(handle, ALPM_PROGRESS_ADD_START, -						newpkg->name, percent, pkg_count, pkg_current); -			} +			PROGRESS(handle, event, newpkg->name, percent, pkg_count, pkg_current);  			/* extract the next file from the archive */  			errors += extract_single_file(handle, archive, entry, newpkg, oldpkg); @@ -651,13 +656,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,  				newpkg->name);  	} -	if(is_upgrade) { -		PROGRESS(handle, ALPM_PROGRESS_UPGRADE_START, -				newpkg->name, 100, pkg_count, pkg_current); -	} else { -		PROGRESS(handle, ALPM_PROGRESS_ADD_START, -				newpkg->name, 100, pkg_count, pkg_current); -	} +	PROGRESS(handle, event, newpkg->name, 100, pkg_count, pkg_current);  	/* run the post-install script if it exists  */  	if(alpm_pkg_has_scriptlet(newpkg) @@ -670,11 +669,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,  		free(scriptlet);  	} -	if(is_upgrade) { -		EVENT(handle, ALPM_EVENT_UPGRADE_DONE, newpkg, oldpkg); -	} else { -		EVENT(handle, ALPM_EVENT_ADD_DONE, newpkg, oldpkg); -	} +	EVENT(handle, done, newpkg, oldpkg);  cleanup:  	_alpm_pkg_free(oldpkg); diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index afa5cd7d..ccbdd1c6 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -321,6 +321,24 @@ typedef enum _alpm_event_t {  	 * to the callback, respectively.  	 */  	ALPM_EVENT_UPGRADE_DONE, +	/** Package will be downgraded. +	 * A pointer to the downgraded package is passed to the callback. +	 */ +	ALPM_EVENT_DOWNGRADE_START, +	/** Package was downgraded. +	 * A pointer to the new package, and a pointer to the old package is passed +	 * to the callback, respectively. +	 */ +	ALPM_EVENT_DOWNGRADE_DONE, +	/** Package will be reinstalled. +	 * A pointer to the reinstalled package is passed to the callback. +	 */ +	ALPM_EVENT_REINSTALL_START, +	/** Package was reinstalled. +	 * A pointer to the new package, and a pointer to the old package is passed +	 * to the callback, respectively. +	 */ +	ALPM_EVENT_REINSTALL_DONE,  	/** Target package's integrity will be checked. */  	ALPM_EVENT_INTEGRITY_START,  	/** Target package's integrity was checked. */ @@ -400,6 +418,8 @@ typedef void (*alpm_cb_question)(alpm_question_t, void *, void *, void *, int *)  typedef enum _alpm_progress_t {  	ALPM_PROGRESS_ADD_START,  	ALPM_PROGRESS_UPGRADE_START, +	ALPM_PROGRESS_DOWNGRADE_START, +	ALPM_PROGRESS_REINSTALL_START,  	ALPM_PROGRESS_REMOVE_START,  	ALPM_PROGRESS_CONFLICTS_START,  	ALPM_PROGRESS_DISKSPACE_START, | 
