[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#916838: apt-sortpkgs : please sort the versions according to the policy



Package: apt-utils
Version: 1.8.0~alpha2
Severity: wishlist
Tags: patch

Dear Maintainer,

apt-sortpkgs currently sorts the various versions
of a package in lexicographical order. It would be helpful
if it could sort them according to the policy (e.g.
to use in mini-dak)

The patch below implements a new option '--compare-version'.

Regards,
JH Chatenet

diff -Naur apt-1.8.0~alpha2.orig/apt-private/private-cmndline.cc apt-1.8.0~alpha2/apt-private/private-cmndline.cc
--- apt-1.8.0~alpha2.orig/apt-private/private-cmndline.cc	2018-11-13 10:31:49.000000000 +0100
+++ apt-1.8.0~alpha2/apt-private/private-cmndline.cc	2018-12-02 15:53:36.802358735 +0100
@@ -319,6 +319,7 @@
 static bool addArgumentsAPTSortPkgs(std::vector<CommandLine::Args> &Args, char const * const)/*{{{*/
 {
    addArg('s',"source","APT::SortPkgs::Source",0);
+   addArg('n',"compare-versions","APT::SortPkgs::CompareVersions",0);
    return true;
 }
 									/*}}}*/
diff -Naur apt-1.8.0~alpha2.orig/cmdline/apt-sortpkgs.cc apt-1.8.0~alpha2/cmdline/apt-sortpkgs.cc
--- apt-1.8.0~alpha2.orig/cmdline/apt-sortpkgs.cc	2018-11-13 10:31:49.000000000 +0100
+++ apt-1.8.0~alpha2/cmdline/apt-sortpkgs.cc	2018-12-05 09:57:01.043949197 +0100
@@ -15,6 +15,7 @@
 
 #include <apt-pkg/cmndline.h>
 #include <apt-pkg/configuration.h>
+#include <apt-pkg/debversion.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/init.h>
@@ -38,6 +39,21 @@
 
 using namespace std;
 
+// Purely lexical comparison of version strings
+static int CompareVersions_as_string(string A, string B)
+{
+   return stringcasecmp(A,B);
+}
+
+// Comparison of version strings as dpkg does
+static int CompareVersions_as_number(string A, string B)
+{
+   return debVS.CmpVersion(A, B);
+}
+
+// Defaults to a simple lexical comparison
+int (*CompareVersions)(string A, string B) = CompareVersions_as_string;
+
 struct PkgName								/*{{{*/
 {
    string Name;
@@ -51,7 +67,7 @@
       int A = stringcasecmp(Name,x.Name);
       if (A == 0)
       {
-	 A = stringcasecmp(Ver,x.Ver);
+	 A = (*CompareVersions)(Ver,x.Ver);
 	 if (A == 0)
 	    A = stringcasecmp(Arch,x.Arch);
       }
@@ -155,6 +171,13 @@
    CommandLine CmdL;
    ParseCommandLine(CmdL, APT_CMD::APT_SORTPKG, &_config, &_system, argc, argv, &ShowHelp, &GetCommands);
 
+   // Sort by ascending version number if option --compare-versions was given
+
+   bool WithVersionNumbers = _config->FindB("APT::SortPkgs::CompareVersions",false);
+
+   if (WithVersionNumbers == true)
+      CompareVersions = &CompareVersions_as_number;
+
    // Match the operation
    for (unsigned int I = 0; I != CmdL.FileSize(); I++)
       if (DoIt(CmdL.FileList[I]) == false)
diff -Naur apt-1.8.0~alpha2.orig/doc/apt-sortpkgs.1.xml apt-1.8.0~alpha2/doc/apt-sortpkgs.1.xml
--- apt-1.8.0~alpha2.orig/doc/apt-sortpkgs.1.xml	2018-11-13 10:31:49.000000000 +0100
+++ apt-1.8.0~alpha2/doc/apt-sortpkgs.1.xml	2018-12-03 19:55:29.482936399 +0100
@@ -50,6 +50,12 @@
      Use source index field ordering.
      Configuration Item: <literal>APT::SortPkgs::Source</literal>.</para></listitem>
      </varlistentry>
+
+     <varlistentry><term><option>-n</option></term><term><option>--compare-versions</option></term>
+     <listitem><para>
+     Sort the different versions of a package by ascending version number.
+     Configuration Item: <literal>APT::SortPkgs::CompareVersions</literal>.</para></listitem>
+     </varlistentry>
    
      &apt-commonoptions;
      


Reply to: