[pacman-dev] [PATCH RFC] DWIM if user attempts to sync on a file

Andrew Eikum coldpie at fastmail.com
Thu Jun 16 00:01:33 UTC 2016


I get bit by this fairly often when I build AUR packages. From my
perspective as a user, the distinction between -U and -S seems
irrelevant: I just want to install this package. So let's just have
pacman offer to Do What I Mean and install the files if I use -S when I
should have used -U.

Signed-off-by: Andrew Eikum <coldpie at fastmail.com>

---

RFC because this lacks tests and maybe UI polish, but I thought I'd see
if there's interest in this change before I put more effort into it.
---
 src/pacman/sync.c | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 8b30603..faad728 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -619,6 +619,9 @@ static int process_targname(alpm_list_t *dblist, const char *targname,
 	return process_group(dblist, targname, error);
 }
 
+#define TGT_FAIL 1
+#define TGT_FAIL_IS_FILE 2
+
 static int process_target(const char *target, int error)
 {
 	/* process targets */
@@ -639,7 +642,7 @@ static int process_target(const char *target, int error)
 		if(!db) {
 			pm_printf(ALPM_LOG_ERROR, _("database not found: %s\n"),
 					dbname);
-			ret = 1;
+			ret = TGT_FAIL;
 			goto cleanup;
 		}
 
@@ -667,6 +670,7 @@ cleanup:
 		pm_printf(ALPM_LOG_WARNING,
 				_("'%s' is a file, did you mean %s instead of %s?\n"),
 				target, "-U/--upgrade", "-S/--sync");
+		ret = TGT_FAIL_IS_FILE;
 	}
 	return ret;
 }
@@ -682,14 +686,29 @@ static int sync_trans(alpm_list_t *targets)
 	}
 
 	/* process targets */
+	if(targets) {
+		retval = -1;
+	}
 	for(i = targets; i; i = alpm_list_next(i)) {
 		const char *targ = i->data;
-		if(process_target(targ, retval) == 1) {
-			retval = 1;
+		int ret = process_target(targ, retval);
+		if(retval < 0) {
+			retval = ret;
+		}else if(retval != ret) {
+			retval = TGT_FAIL;
+		}
+	}
+
+	if(retval == TGT_FAIL_IS_FILE) {
+		int confirm = noyes(_("Proceed with install from file(s)?"));
+		if(confirm) {
+			trans_release();
+			return pacman_upgrade(targets);
 		}
+		retval = TGT_FAIL;
 	}
 
-	if(retval) {
+	if(retval == TGT_FAIL) {
 		trans_release();
 		return retval;
 	}
-- 
2.8.3


More information about the pacman-dev mailing list