[pacman-dev] [PATCH] Move -Sy operation into its own transaction

Chantry Xavier shiningxc at gmail.com
Mon Feb 18 09:14:45 EST 2008


This allows us to remove the sync_only flag, and also do the following
steps in the future :
1) refresh the database (if asked)
2) do other stuff (eg checking if a newer pacman version is available)
3) start the actual transaction

Currently when we detect a newer pacman version, we have to release the
current transaction and start a new one.

Signed-off-by: Chantry Xavier <shiningxc at gmail.com>
---
 src/pacman/sync.c |   97 +++++++++++++++++++++++++++++------------------------
 1 files changed, 53 insertions(+), 44 deletions(-)

diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 27218d6..c4c4090 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -197,11 +197,37 @@ static int sync_cleancache(int level)
 	return(0);
 }
 
+static int sync_trans_init(pmtransflag_t flags) {
+	if(alpm_trans_init(PM_TRANS_TYPE_SYNC, flags, cb_trans_evt,
+				cb_trans_conv, cb_trans_progress) == -1) {
+		fprintf(stderr, _("error: failed to init transaction (%s)\n"),
+				alpm_strerrorlast());
+		if(pm_errno == PM_ERR_HANDLE_LOCK) {
+			printf(_("  if you're sure a package manager is not already\n"
+						"  running, you can remove %s.\n"), alpm_option_get_lockfile());
+		}
+		return(-1);
+	}
+	return(0);
+}
+
+static int sync_trans_release() {
+	if(alpm_trans_release() == -1) {
+		fprintf(stderr, _("error: failed to release transaction (%s)\n"),
+				alpm_strerrorlast());
+		return(-1);
+	}
+	return(0);
+}
 static int sync_synctree(int level, alpm_list_t *syncs)
 {
 	alpm_list_t *i;
 	int success = 0, ret;
 
+	if(sync_trans_init(0) == -1) {
+		return(0);
+	}
+
 	for(i = syncs; i; i = alpm_list_next(i)) {
 		pmdb_t *db = alpm_list_getdata(i);
 
@@ -229,10 +255,16 @@ static int sync_synctree(int level, alpm_list_t *syncs)
 		}
 	}
 
+	if(sync_trans_release() == -1) {
+		return(0);
+	}
 	/* We should always succeed if at least one DB was upgraded - we may possibly
 	 * fail later with unresolved deps, but that should be rare, and would be
 	 * expected
 	 */
+	if(!success) {
+		fprintf(stderr, _("error: failed to synchronize any databases\n"));
+	}
 	return(success > 0);
 }
 
@@ -469,41 +501,19 @@ static int sync_list(alpm_list_t *syncs, alpm_list_t *targets)
 	return(0);
 }
 
-static int sync_trans(alpm_list_t *targets, int sync_only)
+static int sync_trans(alpm_list_t *targets)
 {
 	int retval = 0;
 	alpm_list_t *data = NULL;
 	alpm_list_t *sync_dbs = alpm_option_get_syncdbs();
 
 	/* Step 1: create a new transaction... */
-	if(alpm_trans_init(PM_TRANS_TYPE_SYNC, config->flags, cb_trans_evt,
-		 cb_trans_conv, cb_trans_progress) == -1) {
-		fprintf(stderr, _("error: failed to init transaction (%s)\n"),
-		        alpm_strerrorlast());
-		if(pm_errno == PM_ERR_HANDLE_LOCK) {
-			printf(_("  if you're sure a package manager is not already\n"
-			         "  running, you can remove %s.\n"), alpm_option_get_lockfile());
-		}
+	if(sync_trans_init(config->flags) == -1) {
 		return(1);
 	}
 
-	if(config->op_s_sync) {
-		/* grab a fresh package list */
-		printf(_(":: Synchronizing package databases...\n"));
-		alpm_logaction("synchronizing package lists\n");
-		if(!sync_synctree(config->op_s_sync, sync_dbs)) {
-			fprintf(stderr, _("error: failed to synchronize any databases\n"));
-			retval = 1;
-			goto cleanup;
-		}
-		if(sync_only) {
-			goto cleanup;
-		}
-	}
-
 	if(config->op_s_upgrade) {
 		alpm_list_t *pkgs, *i;
-
 		printf(_(":: Starting full system upgrade...\n"));
 		alpm_logaction("starting full system upgrade\n");
 		if(alpm_trans_sysupgrade() == -1) {
@@ -529,22 +539,15 @@ static int sync_trans(alpm_list_t *targets, int sync_only)
 					printf(_(":: pacman has detected a newer version of itself.\n"));
 					if(yesno(_(":: Do you want to cancel the current operation\n"
 					           ":: and install the new pacman version now? [Y/n] "))) {
-						if(alpm_trans_release() == -1) {
-							fprintf(stderr, _("error: failed to release transaction (%s)\n"),
-							    alpm_strerrorlast());
-							retval = 1;
-							goto cleanup;
+						if(sync_trans_release() == -1) {
+							return(1);
 						}
-						if(alpm_trans_init(PM_TRANS_TYPE_SYNC, config->flags,
-						   cb_trans_evt, cb_trans_conv, cb_trans_progress) == -1) {
-							fprintf(stderr, _("error: failed to init transaction (%s)\n"),
-							    alpm_strerrorlast());
+						if(sync_trans_init(0) == -1) {
 							return(1);
 						}
 						if(alpm_trans_addtarget("pacman") == -1) {
 							fprintf(stderr, _("error: pacman: %s\n"), alpm_strerrorlast());
-							retval = 1;
-							goto cleanup;
+							return(1);
 						}
 						break;
 					}
@@ -744,9 +747,7 @@ cleanup:
 	if(data) {
 		FREELIST(data);
 	}
-	if(alpm_trans_release() == -1) {
-		fprintf(stderr, _("error: failed to release transaction (%s)\n"),
-		        alpm_strerrorlast());
+	if(sync_trans_release() == -1) {
 		retval = 1;
 	}
 
@@ -756,7 +757,6 @@ cleanup:
 int pacman_sync(alpm_list_t *targets)
 {
 	alpm_list_t *sync_dbs = NULL;
-	int sync_only = 0;
 
 	/* clean the cache */
 	if(config->op_s_clean) {
@@ -772,18 +772,27 @@ int pacman_sync(alpm_list_t *targets)
 		return(1);
 	}
 
-	if(config->op_s_search || config->group
-			|| config->op_s_info || config->op_q_list) {
-		sync_only = 1;
-	} else if(targets == NULL && !(config->op_s_sync || config->op_s_upgrade)) {
+	if(targets == NULL && !(config->op_s_sync || config->op_s_upgrade
+				|| config->op_s_search || config->group
+				|| config->op_s_info || config->op_q_list)) {
 		/* don't proceed here unless we have an operation that doesn't require
 		 * a target list */
 		pm_printf(PM_LOG_ERROR, _("no targets specified (use -h for help)\n"));
 		return(1);
 	}
 
+	if(config->op_s_sync) {
+		/* grab a fresh package list */
+		printf(_(":: Synchronizing package databases...\n"));
+		alpm_logaction("synchronizing package lists\n");
+		if(!sync_synctree(config->op_s_sync, sync_dbs)) {
+			return(1);
+		}
+		config->op_s_sync = 0;
+	}
+
 	if(needs_transaction()) {
-		if(sync_trans(targets, sync_only) == 1) {
+		if(sync_trans(targets) == 1) {
 			return(1);
 		}
 	}
-- 
1.5.4.2





More information about the pacman-dev mailing list