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: