Просмотр исходного кода

libdpkg: Change pkg_sorter_by_name() to pkg_sorter_by_nonambig_name_arch()

The reworked function takes into account the architecture while comparing
the packages, if that would make the package name output ambiguous.

Based-on-patch-by: Raphaël Hertzog <hertzog@debian.org>
Patch-sponsored-by: Linaro Limited

Signed-off-by: Guillem Jover <guillem@debian.org>
Guillem Jover лет назад: 14
Родитель
Сommit
463fbf8e93
5 измененных файлов с 26 добавлено и 9 удалено
  1. 1 1
      lib/dpkg/libdpkg.map
  2. 21 4
      lib/dpkg/pkg-show.c
  3. 1 1
      lib/dpkg/pkg-show.h
  4. 2 2
      src/querycmd.c
  5. 1 1
      src/select.c

+ 1 - 1
lib/dpkg/libdpkg.map

@@ -210,7 +210,7 @@ LIBDPKG_PRIVATE {
 	pkg_set_want;
 	pkg_is_informative;
 	copy_dependency_links;
-	pkg_sorter_by_name;
+	pkg_sorter_by_nonambig_name_arch;
 	varbuf_add_pkgbin_name;
 	pkgbin_name;
 	pkg_name;

+ 21 - 4
lib/dpkg/pkg-show.c

@@ -168,7 +168,7 @@ pkg_abbrev_eflag(const struct pkginfo *pkg)
 }
 
 /**
- * Compare a package to be sorted by name.
+ * Compare a package to be sorted by non-ambiguous name and architecture.
  *
  * @param a A pointer of a pointer to a struct pkginfo.
  * @param b A pointer of a pointer to a struct pkginfo.
@@ -179,10 +179,27 @@ pkg_abbrev_eflag(const struct pkginfo *pkg)
  * @retval 1 a is later than b.
  */
 int
-pkg_sorter_by_name(const void *a, const void *b)
+pkg_sorter_by_nonambig_name_arch(const void *a, const void *b)
 {
 	const struct pkginfo *pa = *(const struct pkginfo **)a;
 	const struct pkginfo *pb = *(const struct pkginfo **)b;
-
-	return strcmp(pa->set->name, pb->set->name);
+	const struct pkgbin *pbina = &pa->installed;
+	const struct pkgbin *pbinb = &pb->installed;
+	int res;
+
+	res = strcmp(pa->set->name, pb->set->name);
+	if (res)
+		return res;
+
+	if (pbina->arch == pbinb->arch)
+		return 0;
+
+	if (pkgbin_name_needs_arch(pbina, pnaw_nonambig)) {
+		if (pkgbin_name_needs_arch(pbinb, pnaw_nonambig))
+			return strcmp(pbina->arch->name, pbinb->arch->name);
+		else
+			return 1;
+	} else {
+		return -1;
+	}
 }

+ 1 - 1
lib/dpkg/pkg-show.h

@@ -26,7 +26,7 @@
 
 DPKG_BEGIN_DECLS
 
-int pkg_sorter_by_name(const void *a, const void *b);
+int pkg_sorter_by_nonambig_name_arch(const void *a, const void *b);
 
 const char *pkg_summary(const struct pkginfo *pkg, const struct pkgbin *pkgbin,
                         int *len_ret);

+ 2 - 2
src/querycmd.c

@@ -210,7 +210,7 @@ listpackages(const char *const *argv)
     modstatdb_open(msdbrw_readonly | msdbrw_available_readonly);
 
   pkg_array_init_from_db(&array);
-  pkg_array_sort(&array, pkg_sorter_by_name);
+  pkg_array_sort(&array, pkg_sorter_by_nonambig_name_arch);
 
   fmt.head = false;
   fmt.format[0] = '\0';
@@ -484,7 +484,7 @@ showpackages(const char *const *argv)
     modstatdb_open(msdbrw_readonly | msdbrw_available_readonly);
 
   pkg_array_init_from_db(&array);
-  pkg_array_sort(&array, pkg_sorter_by_name);
+  pkg_array_sort(&array, pkg_sorter_by_nonambig_name_arch);
 
   if (!*argv) {
     for (i = 0; i < array.n_pkgs; i++) {

+ 1 - 1
src/select.c

@@ -62,7 +62,7 @@ getselections(const char *const *argv)
   modstatdb_open(msdbrw_readonly);
 
   pkg_array_init_from_db(&array);
-  pkg_array_sort(&array, pkg_sorter_by_name);
+  pkg_array_sort(&array, pkg_sorter_by_nonambig_name_arch);
 
   if (!*argv) {
     for (i = 0; i < array.n_pkgs; i++) {