summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorXavier Chantry <shiningxc@gmail.com>2009-09-15 16:07:25 +0200
committerDan McGee <dan@archlinux.org>2009-09-20 18:56:46 +0200
commitf4809dcc9c27ac614e2a3381d4ecd8661beec8de (patch)
treed680c5144e14ec021523d7d9e58edb1b4cc78420 /src
parent95cb4b6874424c7109df0f8cebefc17d3756d65f (diff)
downloadpacman-f4809dcc9c27ac614e2a3381d4ecd8661beec8de.tar.gz
pacman-f4809dcc9c27ac614e2a3381d4ecd8661beec8de.tar.xz
sync.c : duplicate the target before modifying it
It was probably a bad idea to modify the target directly in case of repo/pkg syntax. Duplicating it also allows us to keep the original target string, which is more informative when printing errors. Also remove a duplicated error message from libalpm, and improve the message already returned to the frontend. $ pacman -S foo/bar before error: repository 'foo' not found error: 'bar': no such repository after error: 'foo/bar': could not find repository for target Signed-off-by: Xavier Chantry <shiningxc@gmail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'src')
-rw-r--r--src/pacman/sync.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index b23a9633..08e977b2 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -551,32 +551,34 @@ static alpm_list_t *syncfirst() {
static int process_target(char *target)
{
/* process targets */
- char *targ = strchr(target, '/');
- char *db = NULL;
- int ret;
- if(targ) {
- *targ = '\0';
- targ++;
- db = target;
- ret = alpm_sync_dbtarget(db,targ);
+ char *targstring = strdup(target);
+ char *targname = strchr(targstring, '/');
+ char *dbname = NULL;
+ int ret = 0;
+ if(targname) {
+ *targname = '\0';
+ targname++;
+ dbname = targstring;
+ ret = alpm_sync_dbtarget(dbname,targname);
} else {
- targ = target;
- ret = alpm_sync_target(targ);
+ targname = targstring;
+ ret = alpm_sync_target(targname);
}
if(ret == -1) {
if(pm_errno == PM_ERR_TRANS_DUP_TARGET
|| pm_errno == PM_ERR_PKG_IGNORED) {
/* just skip duplicate or ignored targets */
- pm_printf(PM_LOG_WARNING, _("skipping target: %s\n"), targ);
- return(0);
+ pm_printf(PM_LOG_WARNING, _("skipping target: %s\n"), target);
+ } else {
+ pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n", target,
+ alpm_strerrorlast());
+ ret = 1;
}
- pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n",
- targ, alpm_strerrorlast());
- return(1);
}
- return(0);
+ free(targstring);
+ return(ret);
}
static int sync_trans(alpm_list_t *targets)