Hi,
first I didn't get a copy of your mail, I don't know why.

On Mon, 05 Mar 2007 19:48:27 +0100, Guillem Jover wrote:
> On Mon, 2007-03-05 at 00:45:10 +0100, Nico Golde wrote:
> > Package: dpkg
> > Version: 1.13.25
> > Severity: wishlist
> > Tags: patch
> 
> > it would be cool if dpkg could use an external program to 
> > merge a new and an old configuration file on package update.
> > The current situation is a bit suboptimal since you loose 
> > your old changes when installing the new version of a 
> > configuration file (ok there is a backup) and if you keep 
> > your old installation you can miss new configuration 
> > parameters and stuff.
> 
> > I created a patch to introduce a variable for dpkg 
> > (merge-tools e.g. merge-tools /usr/bin/vimdiff) to enable 
> > this feature.
> > You can find the patch on: http://nion.modprobe.de/dpkg_allowmerge.patch
> 
> Please in the future attach patches in your bug reports. 

Seems to be a good idea if I look at bugs living > 8 years in the BTS ;)

> Also by
> skimming over the patch I see this is wrong:
> 
> @@ -62,6 +62,7 @@ enum conffopt {
>    cfof_prompt        =     001,
>    cfof_keep          =     002,
>    cfof_install       =     004,
> +  cfof_merge         =     006,
>    cfof_backup        =   00100,
>    cfof_newconff      =   00200,
>    cfof_isnew         =   00400,
> 
> this should be a uniq octal value to be ORed, and this one is a
> combination of 002 and 004.

Thanks, changed. Patch attached.

> > This would also close 120152 and 32877 since you can just
> > specify these programs.
> 
> Why did you open a new bug report, knowing that there's already 8
> other merged ones, with patches.

Cause people tend to forget things sometimes.
Kind regards
Nico

-- 
Nico Golde - http://www.ngolde.de
JAB: [EMAIL PROTECTED] - GPG: 0x73647CFF
Forget about that mouse with 3/4/5 buttons,
gimme a keyboard with 103/104/105 keys!
diff -Narup dpkg-1.13.25-orig/lib/dbmodify.c dpkg-1.13.25/lib/dbmodify.c
--- dpkg-1.13.25-orig/lib/dbmodify.c	2006-06-21 15:41:12.000000000 +0200
+++ dpkg-1.13.25/lib/dbmodify.c	2007-03-05 19:46:18.000000000 +0100
@@ -286,6 +286,7 @@ void modstatdb_note(struct pkginfo *pkg)
 }
 
 const char *log_file= NULL;
+const char *merge_tool= NULL;
 
 void log_message(const char *fmt, ...) {
   static struct varbuf *log= NULL;
@@ -324,3 +325,38 @@ void log_message(const char *fmt, ...) {
   strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", localtime(&now));
   fprintf(logfd, "%s %s\n", time_str, log->buf);
 }
+
+int call_merge(const char *old, const char *new){
+	int pid;
+	int r;
+	int status;
+
+	if(!merge_tool)
+		return -1;
+
+	if (!(pid=m_fork())) {
+		/* Child process */
+		const char*     s;              /* shell */
+		char            cmdbuf[1024];   /* command to run */
+
+		snprintf(cmdbuf, sizeof cmdbuf, "%s %s %s", merge_tool, old, new);
+
+		s=getenv(SHELLENV);
+		if (!s || !*s)
+			s=DEFAULTSHELL;
+
+		execlp(s,s,"-c", cmdbuf, NULL);
+		ohshite(_("failed to merge with %s (%.250s)"), merge_tool, cmdbuf);
+	}
+
+	/* Parent process */
+	while (((r=waitpid(pid,&status,0))==-1) && (errno==EINTR))
+		;
+
+	if (r!=pid) {
+		onerr_abort++;
+		ohshite(_("wait for shell failed"));
+		return -1;
+	}
+	return 0;
+}
diff -Narup dpkg-1.13.25-orig/lib/dpkg-db.h dpkg-1.13.25/lib/dpkg-db.h
--- dpkg-1.13.25-orig/lib/dpkg-db.h	2006-06-29 02:15:10.000000000 +0200
+++ dpkg-1.13.25/lib/dpkg-db.h	2007-03-05 19:46:18.000000000 +0100
@@ -175,6 +175,7 @@ void modstatdb_shutdown(void);
 extern char *statusfile, *availablefile; /* initialised by modstatdb_init */
 
 void log_message(const char *fmt, ...);
+int call_merge(const char *, const char *);
 
 /*** from database.c ***/
 
diff -Narup dpkg-1.13.25-orig/man/C/dpkg.1 dpkg-1.13.25/man/C/dpkg.1
--- dpkg-1.13.25-orig/man/C/dpkg.1	2006-08-18 04:54:25.000000000 +0200
+++ dpkg-1.13.25/man/C/dpkg.1	2007-03-05 19:46:18.000000000 +0100
@@ -490,6 +490,11 @@ upgrade, remove, purge; and `YYYY-MM-DD 
 <decision>' for conffile changes where \fI<decision>\fP is either install
 or keep.
 .TP
+\fB\-\-merge-tool=\fP\fIprogram\fP
+If dpkg will install a new configuration file and there are changes
+from the old one, dpkg will use the specified program to do a manual or
+automatic merge of the files depending on the used program.
+.TP
 \fB\-\-no\-debsig\fP
 Do not try to verify package signatures.
 .
diff -Narup dpkg-1.13.25-orig/src/configure.c dpkg-1.13.25/src/configure.c
--- dpkg-1.13.25-orig/src/configure.c	2006-06-19 03:22:03.000000000 +0200
+++ dpkg-1.13.25/src/configure.c	2007-03-05 19:46:18.000000000 +0100
@@ -226,6 +226,12 @@ void deferred_configure(struct pkginfo *
 			what=promptconfaction(conff->name, cdr.buf, cdr2.buf, useredited, distedited, what);
 
 			switch (what & ~(cfof_isnew|cfof_userrmd)) {
+				case cfo_merge:
+					if(call_merge(cdr.buf, cdr2.buf) == -1)
+						fprintf(stderr,
+								_("dpkg: %s: warning - failed to merge `%.250s %.250s': %s\n"),
+								pkg->name, cdr2.buf, cdr.buf, strerror(errno));
+					break;
 				case cfo_keep | cfof_backup:
 					strcpy(cdr2rest,DPKGOLDEXT);
 					if (unlink(cdr2.buf) && errno != ENOENT)
@@ -607,13 +613,21 @@ static enum conffopt promptconfaction(co
 			}
 		}
 
-
-		fprintf(stderr,
-				_("   What would you like to do about it ?  Your options are:\n"
-					"    Y or I  : install the package maintainer's version\n"
-					"    N or O  : keep your currently-installed version\n"
-					"      D     : show the differences between the versions\n"
-					"      Z     : background this process to examine the situation\n"));
+		if(!merge_tool)
+			fprintf(stderr,
+					_("   What would you like to do about it ?  Your options are:\n"
+						"    Y or I  : install the package maintainer's version\n"
+						"    N or O  : keep your currently-installed version\n"
+						"      D     : show the differences between the versions\n"
+						"      Z     : background this process to examine the situation\n"));
+		else
+			fprintf(stderr,
+					_("   What would you like to do about it ?  Your options are:\n"
+						"    Y or I  : install the package maintainer's version\n"
+						"    N or O  : keep your currently-installed version\n"
+						"      D     : show the differences between the versions\n"
+						"      Z     : background this process to examine the situation\n"
+						"      M     : start merge-tool to merge new and old version\n"));
 
 		if (what & cfof_keep)
 			fprintf(stderr, _(" The default action is to keep your current version.\n"));
@@ -651,7 +665,7 @@ static enum conffopt promptconfaction(co
 		if (cc == 'z')
 			suspend();
 
-	} while (!strchr("yino",cc));
+	} while (!strchr("yinom",cc));
 
 	log_message("conffile %s %s", cfgfile,
 		    (cc == 'i' || cc == 'y') ? "install" : "keep");
@@ -668,6 +682,12 @@ static enum conffopt promptconfaction(co
 		case 'o':
 			what |= cfof_keep|cfof_backup;
 			break;
+		case 'm':
+			if(merge_tool)
+				what = cfof_merge;
+			else
+				what |= cfof_keep|cfof_backup;
+			break;
 
 		default:
 			internerr("unknown response");
diff -Narup dpkg-1.13.25-orig/src/main.c dpkg-1.13.25/src/main.c
--- dpkg-1.13.25-orig/src/main.c	2006-06-19 03:22:03.000000000 +0200
+++ dpkg-1.13.25/src/main.c	2007-03-05 19:46:18.000000000 +0100
@@ -115,6 +115,7 @@ static void usage(void) {
 "  -D|--debug=<octal>         Enable debugging (see -Dhelp or --debug=help).\n"
 "  --status-fd <n>            Send status change updates to file descriptor <n>.\n"
 "  --log=<filename>           Log status changes and actions to <filename>.\n"
+"  --merge-tool=<program>     Use program when merging config files.\n"
 "  --ignore-depends=<package>,...\n"
 "                             Ignore dependencies involving <package>.\n"
 "  --force-...                Override problems (see --force-help).\n"
@@ -374,6 +375,7 @@ static void setforce(const struct cmdinf
 }
 
 extern const char *log_file;
+extern const char *merge_tool;
 
 static const char okpassshortopts[]= "D";
 
@@ -425,6 +427,7 @@ static const struct cmdinfo cmdinfos[]= 
   
   { "status-fd",	  0,   1,  0,              0,  setpipe, 0, &status_pipes },
   { "log",                0,   1,  0, &log_file,       0                             },
+  { "merge-tool",         0,   1,  0, &merge_tool,     0                             },
   { "pending",           'a',  0,  &f_pending,     0,  0,             1              },
   { "recursive",         'R',  0,  &f_recursive,   0,  0,             1              },
   { "no-act",             0,   0,  &f_noact,       0,  0,             1              },
diff -Narup dpkg-1.13.25-orig/src/main.h dpkg-1.13.25/src/main.h
--- dpkg-1.13.25-orig/src/main.h	2006-06-19 03:22:03.000000000 +0200
+++ dpkg-1.13.25/src/main.h	2007-03-05 19:46:46.000000000 +0100
@@ -67,12 +67,14 @@ enum conffopt {
   cfof_isnew         =   00400,
   cfof_isold         =   01000,
   cfof_userrmd       =   02000,
+  cfof_merge         =   04000,
   cfom_main          =     007,
   cfo_keep           =   cfof_keep,
   cfo_prompt_keep    =   cfof_keep | cfof_prompt,
   cfo_prompt         =               cfof_prompt,
   cfo_prompt_install =               cfof_prompt | cfof_install,
   cfo_install        =                             cfof_install,
+  cfo_merge          =   cfof_merge,
   cfo_newconff       =                             cfof_install | cfof_newconff,
   cfo_identical      =   cfof_keep
 };
@@ -80,6 +82,7 @@ enum conffopt {
 extern int conffoptcells[2][2];
 extern const char *const statusstrings[];
 
+extern const char *merge_tool;
 extern const struct cmdinfo *cipaction;
 extern int f_pending, f_recursive, f_alsoselect, f_skipsame, f_noact;
 extern int f_autodeconf, f_largemem, f_nodebsig;

Attachment: pgpqEt0L5ObZ8.pgp
Description: PGP signature

Reply via email to