diff options
Diffstat (limited to 'lib/libalpm')
| -rw-r--r-- | lib/libalpm/alpm.h | 1 | ||||
| -rw-r--r-- | lib/libalpm/package.c | 38 | ||||
| -rw-r--r-- | lib/libalpm/sync.c | 30 | 
3 files changed, 41 insertions, 28 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index fbef0570..16b48a0a 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -224,6 +224,7 @@ size_t alpm_pkg_changelog_read(void *ptr, size_t size,  /*int alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp);*/  int alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp);  unsigned short alpm_pkg_has_scriptlet(pmpkg_t *pkg); +unsigned short alpm_pkg_has_force(pmpkg_t *pkg);  off_t alpm_pkg_download_size(pmpkg_t *newpkg); diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 49238ea8..eaef688d 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -295,6 +295,20 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg)  	return pkg->groups;  } +unsigned short SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg) +{ +	ALPM_LOG_FUNC; + +	/* Sanity checks */ +	ASSERT(handle != NULL, return(-1)); +	ASSERT(pkg != NULL, return(-1)); + +	if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { +		_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); +	} +	return pkg->force; +} +  alpm_list_t SYMEXPORT *alpm_pkg_get_depends(pmpkg_t *pkg)  {  	ALPM_LOG_FUNC; @@ -827,32 +841,18 @@ void _alpm_pkg_free(pmpkg_t *pkg)  	FREE(pkg);  } -/* Is pkgB an upgrade for pkgA ? */ -int _alpm_pkg_compare_versions(pmpkg_t *local_pkg, pmpkg_t *pkg) +/* Is spkg an upgrade for locapkg? */ +int _alpm_pkg_compare_versions(pmpkg_t *spkg, pmpkg_t *localpkg)  {  	int cmp = 0;  	ALPM_LOG_FUNC; -	if(pkg->origin == PKG_FROM_CACHE) { -		/* ensure we have the /desc file, which contains the 'force' option */ -		_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); -	} - -	/* compare versions and see if we need to upgrade */ -	cmp = alpm_pkg_vercmp(alpm_pkg_get_version(pkg), alpm_pkg_get_version(local_pkg)); +	cmp = alpm_pkg_vercmp(alpm_pkg_get_version(spkg), +			alpm_pkg_get_version(localpkg)); -	if(cmp != 0 && pkg->force) { +	if(cmp < 0 && alpm_pkg_has_force(spkg)) {  		cmp = 1; -		_alpm_log(PM_LOG_WARNING, _("%s: forcing upgrade to version %s\n"), -							alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg)); -	} else if(cmp < 0) { -		/* local version is newer */ -		pmdb_t *db = pkg->origin_data.db; -		_alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)\n"), -							alpm_pkg_get_name(local_pkg), alpm_pkg_get_version(local_pkg), -							alpm_db_get_name(db), alpm_pkg_get_version(pkg)); -		cmp = 0;  	}  	return(cmp); diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 7a577a12..4a705b57 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -170,6 +170,7 @@ pmpkg_t SYMEXPORT *alpm_sync_newversion(pmpkg_t *pkg, alpm_list_t *dbs_sync)  {  	alpm_list_t *i;  	pmpkg_t *spkg = NULL; +	int cmp;  	for(i = dbs_sync; !spkg && i; i = i->next) {  		spkg = _alpm_db_get_pkgfromcache(i->data, alpm_pkg_get_name(pkg)); @@ -182,14 +183,20 @@ pmpkg_t SYMEXPORT *alpm_sync_newversion(pmpkg_t *pkg, alpm_list_t *dbs_sync)  	}  	/* compare versions and see if spkg is an upgrade */ -	if(_alpm_pkg_compare_versions(pkg, spkg)) { +	cmp = _alpm_pkg_compare_versions(spkg, pkg); +	if(cmp > 0) {  		_alpm_log(PM_LOG_DEBUG, "new version of '%s' found (%s => %s)\n",  					alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg),  					alpm_pkg_get_version(spkg));  		return(spkg); -	} else { -		return(NULL);  	} +	if (cmp < 0) { +			pmdb_t *db = spkg->origin_data.db; +			_alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)\n"), +					alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg), +					alpm_db_get_name(db), alpm_pkg_get_version(spkg)); +	} +	return(NULL);  }  /** Get a list of upgradable packages on the current system @@ -326,18 +333,23 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy  	local = _alpm_db_get_pkgfromcache(db_local, alpm_pkg_get_name(spkg));  	if(local) { -		if(_alpm_pkg_compare_versions(local, spkg) == 0) { -			/* spkg is NOT an upgrade */ +		int cmp = _alpm_pkg_compare_versions(spkg, local); +		if(cmp == 0) {  			if(trans->flags & PM_TRANS_FLAG_NEEDED) { +				/* with the NEEDED flag, packages up to date are not reinstalled */  				_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping\n"),  						alpm_pkg_get_name(local), alpm_pkg_get_version(local));  				return(0);  			} else { -				if(!(trans->flags & PM_TRANS_FLAG_DOWNLOADONLY)) { -					_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- reinstalling\n"), -							alpm_pkg_get_name(local), alpm_pkg_get_version(local)); -				} +				_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- reinstalling\n"), +						alpm_pkg_get_name(local), alpm_pkg_get_version(local)); +  			} +		} else if(cmp < 0) { +			/* local version is newer */ +			_alpm_log(PM_LOG_WARNING, _("downgrading package %s (%s => %s)\n"), +					alpm_pkg_get_name(local), alpm_pkg_get_version(local), +					alpm_pkg_get_version(spkg));  		}  	}  | 
