ソースを参照

On package configuration, differentiate between modified and
deleted configuration files (Ian Jackson). Closes: #351361

Frank Lichtenheld 20 年 前
コミット
5df03bfaaa
共有3 個のファイルを変更した24 個の追加7 個の削除を含む
  1. 8 0
      ChangeLog
  2. 2 0
      debian/changelog
  3. 14 7
      src/configure.c

+ 8 - 0
ChangeLog

@@ -1,3 +1,11 @@
+2006-02-10  Ian Jackson <iwj@ubuntu.com>
+
+	* src/configure.c: Differentiate between modified
+	and deleted configuration files. Gives and more
+	accurate description to the user and eliminates
+	a warning that was produced when trying to
+	backup a non-existant file.
+
 2006-02-10  James R. Van Zandt  <jrvz@comcast.net>
 
 	* man/C/dpkg.1: Document the default log file. The behaviour in case

+ 2 - 0
debian/changelog

@@ -42,6 +42,8 @@ dpkg (1.13.14~) UNRELEASED; urgency=low
     by creating new files in a secure manner. Closes: #178839, #338591
   * Fix some semantic errors in dpkg-shlibdeps due to typos in used
     variables.
+  * On package configuration, differentiate between modified and
+    deleted configuration files (Ian Jackson). Closes: #351361
 
   [ Christian Perrier ]
   * Switch to po4a for manpages translation. Closes: #320122

+ 14 - 7
src/configure.c

@@ -214,6 +214,8 @@ void deferred_configure(struct pkginfo *pkg) {
 				useredited= strcmp(conff->hash,currenthash) != 0;
 				distedited= strcmp(conff->hash,newdisthash) != 0;
 				what= conffoptcells[useredited][distedited];
+				if (!strcmp(currenthash,NONEXISTENTFLAG))
+					what |= cfof_userrmd;
 			}
 
 			debug(dbg_conff,
@@ -222,7 +224,7 @@ void deferred_configure(struct pkginfo *pkg) {
 
 			what=promptconfaction(conff->name, cdr.buf, cdr2.buf, useredited, distedited, what);
 
-			switch (what & ~cfof_isnew) {
+			switch (what & ~(cfof_isnew|cfof_userrmd)) {
 				case cfo_keep | cfof_backup:
 					strcpy(cdr2rest,DPKGOLDEXT);
 					if (unlink(cdr2.buf) && errno != ENOENT)
@@ -258,8 +260,9 @@ void deferred_configure(struct pkginfo *pkg) {
 						fprintf(stderr,
 								_("dpkg: %s: warning - failed to remove `%.250s' (before overwrite): %s\n"),
 								pkg->name, cdr2.buf, strerror(errno));
-					if (link(cdr.buf,cdr2.buf))
-						fprintf(stderr,
+					if (!(what & cfof_userrmd))
+						if (link(cdr.buf,cdr2.buf))
+							fprintf(stderr,
 								_("dpkg: %s: warning - failed to link `%.250s' to `%.250s': %s\n"),
 								pkg->name, cdr.buf, cdr2.buf, strerror(errno));
 					/* fall through */
@@ -560,9 +563,11 @@ static enum conffopt promptconfaction(const char* cfgfile, const char* realold,
 						" ==> File on system created by you or by a script.\n"
 						" ==> File also in package provided by package maintainer.\n"));
 		} else {
-			fprintf(stderr, useredited ?
+			fprintf(stderr, !useredited ?
+					_("\n     Not modified since installation.\n") :
+							!(what & cfof_userrmd) ?
 					_("\n ==> Modified (by you or by a script) since installation.\n") :
-					_("\n     Not modified since installation.\n"));
+					_("\n ==> Deleted (by you or by a script) since installation.\n"));
 
 			fprintf(stderr, distedited ?
 					_(" ==> Package distributor has shipped an updated version.\n") :
@@ -646,15 +651,17 @@ static enum conffopt promptconfaction(const char* cfgfile, const char* realold,
 	log_message("conffile %s %s", cfgfile,
 		    (cc == 'i' || cc == 'y') ? "install" : "keep");
 
+	what &= cfof_userrmd;
+
 	switch (cc) {
 		case 'i':
 		case 'y':
-			what=cfof_install|cfof_backup;
+			what |= cfof_install|cfof_backup;
 			break;
 
 		case 'n':
 		case 'o':
-			what=cfof_keep|cfof_backup;
+			what |= cfof_keep|cfof_backup;
 			break;
 
 		default: