From 52e7e6d74733f7a431376a9e528c4fe4d3732068 Mon Sep 17 00:00:00 2001 From: Chantry Xavier Date: Wed, 3 Oct 2007 21:02:36 -0500 Subject: needs_transaction adjustments I just moved the root path check out of needs_transaction, and put it directly in pacman.c . I think this part is alright. For the other problems, I thought about doing the transaction first, in a new sync trans function, which will init and release a transaction. And then doing the commands like -Ss / -Sl / -Sg / -Si. The problem is that for commands like -Sys / -Syl / etc, only the refresh part of the transaction should be done. So I had to introduce an ugly sync_only hack. Signed-off-by: Aaron Griffin --- src/pacman/pacman.c | 4 +- src/pacman/sync.c | 115 +++++++++++++++++++++++++++++----------------------- src/pacman/util.c | 5 +-- 3 files changed, 69 insertions(+), 55 deletions(-) (limited to 'src/pacman') diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index c57d3464..74493986 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -775,7 +775,9 @@ int main(int argc, char *argv[]) #if defined(HAVE_GETEUID) /* check if we have sufficient permission for the requested operation */ - if(myuid > 0 && needs_transaction()) { + if(myuid > 0 && !strcmp(alpm_option_get_root(), "/") && needs_transaction()) { + /* special case: ignore root user check if -r is specified, fall back on + * normal FS checking */ pm_printf(PM_LOG_ERROR, _("you cannot perform this operation unless you are root.\n")); cleanup(EXIT_FAILURE); } diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 0d10d70a..78ce9b71 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -390,33 +390,14 @@ static int sync_list(alpm_list_t *syncs, alpm_list_t *targets) return(0); } -int pacman_sync(alpm_list_t *targets) +int sync_trans(alpm_list_t *targets, int sync_only) { int retval = 0; - alpm_list_t *sync_dbs = NULL; - - /* clean the cache */ - if(config->op_s_clean) { - return(sync_cleancache(config->op_s_clean)); - } - - /* ensure we have at least one valid sync db set up */ - sync_dbs = alpm_option_get_syncdbs(); - if(sync_dbs == NULL || alpm_list_count(sync_dbs) == 0) { - pm_printf(PM_LOG_ERROR, _("no usable package repositories configured.\n")); - return(1); - } - - /* don't proceed here unless we have an operation that doesn't require - * a target list */ - if(targets == NULL && !(config->op_s_sync || config->op_s_upgrade)) { - pm_printf(PM_LOG_ERROR, _("no targets specified (use -h for help)\n")); - return(1); - } + alpm_list_t *data = NULL; + alpm_list_t *sync_dbs = alpm_option_get_syncdbs(); /* Step 1: create a new transaction... */ - if(needs_transaction() && - alpm_trans_init(PM_TRANS_TYPE_SYNC, config->flags, cb_trans_evt, + 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()); @@ -435,30 +416,9 @@ int pacman_sync(alpm_list_t *targets) fprintf(stderr, _("error: failed to synchronize any databases\n")); return(1); } - } - - /* search for a package */ - if(config->op_s_search) { - retval = sync_search(sync_dbs, targets); - goto cleanup; - } - - /* look for groups */ - if(config->group) { - retval = sync_group(config->group, sync_dbs, targets); - goto cleanup; - } - - /* get package info */ - if(config->op_s_info) { - retval = sync_info(sync_dbs, targets); - goto cleanup; - } - - /* get a listing of files in sync DBs */ - if(config->op_q_list) { - retval = sync_list(sync_dbs, targets); - goto cleanup; + if(sync_only) { + goto cleanup; + } } if(config->op_s_upgrade) { @@ -535,7 +495,7 @@ int pacman_sync(alpm_list_t *targets) } /* target not found: check if it's a group */ - for(j = alpm_option_get_syncdbs(); j; j = alpm_list_next(j)) { + for(j = sync_dbs; j; j = alpm_list_next(j)) { pmdb_t *db = alpm_list_getdata(j); grp = alpm_db_readgrp(db, targ); if(grp) { @@ -565,7 +525,7 @@ int pacman_sync(alpm_list_t *targets) if(!found) { /* targ not found in sync db, searching for providers... */ const char *pname = NULL; - for(j = alpm_option_get_syncdbs(); j; j = alpm_list_next(j)) { + for(j = sync_dbs; j; j = alpm_list_next(j)) { pmdb_t *db = alpm_list_getdata(j); alpm_list_t *prov = alpm_db_whatprovides(db, targ); if(prov) { @@ -588,7 +548,6 @@ int pacman_sync(alpm_list_t *targets) } /* Step 2: "compute" the transaction based on targets and flags */ - alpm_list_t *data; if(alpm_trans_prepare(&data) == -1) { fprintf(stderr, _("error: failed to prepare transaction (%s)\n"), alpm_strerrorlast()); @@ -716,4 +675,60 @@ cleanup: return(retval); } +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) { + return(sync_cleancache(config->op_s_clean)); + } + + /* ensure we have at least one valid sync db set up */ + sync_dbs = alpm_option_get_syncdbs(); + if(sync_dbs == NULL || alpm_list_count(sync_dbs) == 0) { + pm_printf(PM_LOG_ERROR, _("no usable package repositories configured.\n")); + 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)) { + /* 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(needs_transaction()) { + if(sync_trans(targets, sync_only) == 1) { + return(1); + } + } + + /* search for a package */ + if(config->op_s_search) { + return(sync_search(sync_dbs, targets)); + } + + /* look for groups */ + if(config->group) { + return(sync_group(config->group, sync_dbs, targets)); + } + + /* get package info */ + if(config->op_s_info) { + return(sync_info(sync_dbs, targets)); + } + + /* get a listing of files in sync DBs */ + if(config->op_q_list) { + return(sync_list(sync_dbs, targets)); + } + + return(0); +} + /* vim: set ts=2 sw=2 noet: */ diff --git a/src/pacman/util.c b/src/pacman/util.c index 4cb93156..d82b5769 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -51,11 +51,8 @@ int needs_transaction() if((config->op == PM_OP_SYNC && !config->op_s_sync && (config->op_s_search || config->group || config->op_q_list || config->op_q_info || config->flags & PM_TRANS_FLAG_PRINTURIS)) - || config->op == PM_OP_DEPTEST - || (strcmp(alpm_option_get_root(), "/") != 0)) { + || config->op == PM_OP_DEPTEST) { /* special case: PM_OP_SYNC can be used w/ config->op_s_search by any user */ - /* special case: ignore root user check if -r is specified, fall back on - * normal FS checking */ return(0); } else { return(1); -- cgit v1.2.3