diff options
| -rw-r--r-- | lib/libalpm/alpm.h | 20 | ||||
| -rw-r--r-- | lib/libalpm/sync.c | 86 | 
2 files changed, 62 insertions, 44 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 5914b470..9443849d 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -33,7 +33,7 @@ extern "C" {  #define PM_DBPATH   "var/lib/pacman"  #define PM_CACHEDIR "var/cache/pacman/pkg" -#define PM_LOCK   "/tmp/pacman.lck" +#define PM_LOCK "/tmp/pacman.lck"  #define PM_EXT_PKG ".pkg.tar.gz"  #define PM_EXT_DB  ".db.tar.gz" @@ -209,14 +209,16 @@ enum {  };  /* Flags */ -#define PM_TRANS_FLAG_NODEPS  0x01 -#define PM_TRANS_FLAG_FORCE   0x02 -#define PM_TRANS_FLAG_NOSAVE  0x04 -#define PM_TRANS_FLAG_FRESHEN 0x08 -#define PM_TRANS_FLAG_CASCADE 0x10 -#define PM_TRANS_FLAG_RECURSE 0x20 -#define PM_TRANS_FLAG_DBONLY  0x40 -#define PM_TRANS_FLAG_ALLDEPS 0x80 +#define PM_TRANS_FLAG_FORCE       0x001 +#define PM_TRANS_FLAG_DBONLY      0x002 +#define PM_TRANS_FLAG_NOSAVE      0x004 +#define PM_TRANS_FLAG_FRESHEN     0x008 +#define PM_TRANS_FLAG_CASCADE     0x010 +#define PM_TRANS_FLAG_RECURSE     0x020 +#define PM_TRANS_FLAG_NODEPS      0x040 +#define PM_TRANS_FLAG_ALLDEPS     0x080 +#define PM_TRANS_FLAG_NOCONFLICTS 0x100 +#define PM_TRANS_FLAG_NOSCRIPLET  0x200  /* Transaction Events */  enum { diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 49116f14..3a366aad 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -251,10 +251,12 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync)  			          local->name, local->version, local->version, spkg->version);  			if(!find_pkginsync(spkg->name, trans->packages)) {  				pmpkg_t *dummy = _alpm_pkg_new(local->name, local->version); +				if(dummy == NULL) { +					goto error; +				}  				sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, dummy);  				if(sync == NULL) {  					FREEPKG(dummy); -					pm_errno = PM_ERR_MEMORY;  					goto error;  				}  				trans->packages = _alpm_list_add(trans->packages, sync); @@ -388,6 +390,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  	PMList *trail = NULL; /* breadcrum list to avoid running into circles */  	PMList *asked = NULL;  	PMList *i, *j; +	int ret = 0;  	ASSERT(db_local != NULL, RET_ERR(PM_ERR_DB_NULL, -1));  	ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); @@ -396,11 +399,12 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  		*data = NULL;  	} +	for(i = trans->packages; i; i = i->next) { +		pmsyncpkg_t *sync = i->data; +		list = _alpm_list_add(list, sync->pkg); +	} +  	if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) { -		for(i = trans->packages; i; i = i->next) { -			pmsyncpkg_t *sync = i->data; -			list = _alpm_list_add(list, sync->pkg); -		}  		trail = _alpm_list_new();  		/* Resolve targets dependencies */ @@ -410,7 +414,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  			pmpkg_t *spkg = ((pmsyncpkg_t *)i->data)->pkg;  			if(_alpm_resolvedeps(db_local, dbs_sync, spkg, list, trail, trans, data) == -1) {  				/* pm_errno is set by resolvedeps */ -				goto error; +				ret = -1; +				goto cleanup;  			}  		}  		for(i = list; i; i = i->next) { @@ -419,7 +424,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  			if(!find_pkginsync(spkg->name, trans->packages)) {  				pmsyncpkg_t *sync = _alpm_sync_new(PM_SYNC_TYPE_DEPEND, spkg, NULL);  				if(sync == NULL) { -					goto error; +					ret = -1; +					goto cleanup;  				}  				trans->packages = _alpm_list_add(trans->packages, sync);  				_alpm_log(PM_LOG_FLOW2, "adding package %s-%s to the transaction targets", @@ -428,9 +434,6 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  		}  		EVENT(trans, PM_TRANS_EVT_RESOLVEDEPS_DONE, NULL, NULL); -		/* check for inter-conflicts and whatnot */ -		EVENT(trans, PM_TRANS_EVT_INTERCONFLICTS_START, NULL, NULL); -  		_alpm_log(PM_LOG_FLOW1, "looking for unresolvable dependencies");  		deps = _alpm_checkdeps(db_local, PM_TRANS_TYPE_UPGRADE, list);  		if(deps) { @@ -439,10 +442,17 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  				deps = NULL;  			}  			pm_errno = PM_ERR_UNSATISFIED_DEPS; -			goto error; +			ret = -1; +			goto cleanup;  		} -		/* no unresolvable deps, so look for conflicts */ +		FREELISTPTR(trail); +	} + +	if(!(trans->flags & PM_TRANS_FLAG_NOCONFLICTS)) { +		/* check for inter-conflicts and whatnot */ +		EVENT(trans, PM_TRANS_EVT_INTERCONFLICTS_START, NULL, NULL); +  		_alpm_log(PM_LOG_FLOW1, "looking for conflicts");  		deps = _alpm_checkconflicts(db_local, list);  		if(deps) { @@ -549,7 +559,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  								if(data) {  									FREELIST(*data);  								} -								goto error; +								ret = -1; +								goto cleanup;  							}  							q->requiredby = _alpm_list_strdup(local->requiredby);  							if(sync->type != PM_SYNC_TYPE_REPLACE) { @@ -576,7 +587,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  									_alpm_log(PM_LOG_ERROR, "malloc failure: could not allocate %d bytes", sizeof(pmdepmissing_t));  									FREELIST(*data);  									pm_errno = PM_ERR_MEMORY; -									goto error; +									ret = -1; +									goto cleanup;  								}  								*miss = *(pmdepmissing_t *)i->data;  								*data = _alpm_list_add(*data, miss); @@ -591,7 +603,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  							_alpm_log(PM_LOG_ERROR, "malloc failure: could not allocate %d bytes", sizeof(pmdepmissing_t));  							FREELIST(*data);  							pm_errno = PM_ERR_MEMORY; -							goto error; +							ret = -1; +							goto cleanup;  						}  						*miss = *(pmdepmissing_t *)i->data;  						*data = _alpm_list_add(*data, miss); @@ -600,24 +613,26 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  			}  			if(errorout) {  				pm_errno = PM_ERR_CONFLICTING_DEPS; -				goto error; +				ret = -1; +				goto cleanup;  			}  			FREELIST(deps); +			FREELIST(asked);  		}  		EVENT(trans, PM_TRANS_EVT_INTERCONFLICTS_DONE, NULL, NULL); +	} -		FREELISTPTR(list); -		FREELISTPTR(trail); -		FREELIST(asked); - -		/* XXX: this fails for cases where a requested package wants -		 *      a dependency that conflicts with an older version of -		 *      the package.  It will be removed from final, and the user -		 *      has to re-request it to get it installed properly. -		 * -		 *      Not gonna happen very often, but should be dealt with... -		 */ +	FREELISTPTR(list); + +	/* XXX: this fails for cases where a requested package wants +	 *      a dependency that conflicts with an older version of +	 *      the package.  It will be removed from final, and the user +	 *      has to re-request it to get it installed properly. +	 * +	 *      Not gonna happen very often, but should be dealt with... +	 */ +	if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) {  		/* Check dependencies of packages in rmtargs and make sure  		 * we won't be breaking anything by removing them.  		 * If a broken dep is detected, make sure it's not from a @@ -648,7 +663,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  						pmpkg_t *conflictp = _alpm_db_get_pkgfromcache(db_local, miss->depend.name);  						if(!leavingp || !conflictp) {  							_alpm_log(PM_LOG_ERROR, "something has gone horribly wrong"); -							goto error; +							ret = -1; +							goto cleanup;  						}  						/* Look through the upset package's dependencies and try to match one up  						 * to a provisio from the package we want to remove */ @@ -683,7 +699,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  									_alpm_log(PM_LOG_ERROR, "malloc failure: could not allocate %d bytes", sizeof(pmdepmissing_t));  									FREELIST(*data);  									pm_errno = PM_ERR_MEMORY; -									goto error; +									ret = -1; +									goto cleanup;  								}  								*miss = *(pmdepmissing_t *)i->data;  								*data = _alpm_list_add(*data, miss); @@ -693,23 +710,22 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PML  				}  				if(errorout) {  					pm_errno = PM_ERR_UNSATISFIED_DEPS; -					goto error; +					ret = -1; +					goto cleanup;  				}  				FREELIST(deps);  			} -			FREELISTPTR(list);  		}  		/*EVENT(trans, PM_TRANS_EVT_CHECKDEPS_DONE, NULL, NULL);*/  	} -	return(0); - -error: +cleanup:  	FREELISTPTR(list);  	FREELISTPTR(trail);  	FREELIST(asked);  	FREELIST(deps); -	return(-1); + +	return(ret);  }  int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, PMList **data)  | 
