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

Bug#429658: python-apt: DebianDistribution class misses method used by SoftwareProperties



Package: python-apt
Version: 0.7.2
Severity: important

Hello!

I'm packaging SoftwareProperties for Debian, and noticed that it uses a
method called get_server_list in the ${NAME}Distribution class of the
distribution it is running on, and which is in aptsources/distro.py.

I wrote a proposed patch that generalizes get_server_list and also
get_mirrors, but forces the customization of _get_mirror_name. It seems
to work, but notice that I'm not familiar with the code yet. Please consider
applying this patch, or a reworked version, please =).

See you,

-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.21-1-686 (SMP w/2 CPU cores)
Locale: LANG=pt_BR.UTF-8, LC_CTYPE=pt_BR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages python-apt depends on:
ii  apt [libapt-pkg-libc6.5 0.7.2            Advanced front-end for dpkg
ii  apt-utils [libapt-inst- 0.7.2            APT utility programs
ii  libc6                   2.5-11           GNU C Library: Shared libraries
ii  libgcc1                 1:4.2-20070609-1 GCC support library
ii  libstdc++6              4.2-20070609-1   The GNU Standard C++ Library v3
ii  lsb-release             3.1-23.1         Linux Standard Base version report
ii  python                  2.4.4-6          An interactive high-level object-o
ii  python-central          0.5.14           register and build utility for Pyt

python-apt recommends no packages.

-- no debconf information
diff -Nru --exclude '*.mo' --exclude '*.po' --exclude '*.pot' /tmp/KKyGU72DhZ/python-apt-0.7.2/aptsources/distro.py /tmp/cEKADQ0COl/python-apt-0.7.2.1/aptsources/distro.py
--- /tmp/KKyGU72DhZ/python-apt-0.7.2/aptsources/distro.py	2007-06-10 23:21:25.000000000 +0100
+++ /tmp/cEKADQ0COl/python-apt-0.7.2.1/aptsources/distro.py	2007-06-19 12:16:52.000000000 +0100
@@ -131,7 +131,7 @@
 
     self.get_mirrors()
   
-  def get_mirrors(self):
+  def get_mirrors(self, mirror_template=None):
     """
     Provide a set of mirrors where you can get the distribution from
     """
@@ -149,6 +149,97 @@
     else:
         self.default_server = self.main_sources[0].uri
 
+    # get a list of country codes and real names
+    self.countries = {}
+    try:
+        f = open("/usr/share/iso-codes/iso_3166.tab", "r")
+        lines = f.readlines()
+        for line in lines:
+            parts = line.split("\t")
+            self.countries[parts[0].lower()] = parts[1].strip()
+    except:
+        print "could not open file '%s'" % file
+    else:
+        f.close()
+
+    # try to guess the nearest mirror from the locale
+    self.country = None
+    self.country_code = None
+    locale = os.getenv("LANG", default="en.UK")
+    a = locale.find("_")
+    z = locale.find(".")
+    if z == -1:
+        z = len(locale)
+    country_code = locale[a+1:z].lower()
+
+    if mirror_template:
+      self.nearest_server = mirror_template % country_code
+
+    if self.countries.has_key(country_code):
+        self.country = self.countries[country_code]
+        self.country_code = country_code
+
+  def _get_mirror_name(self, server):
+      ''' Try to get a human readable name for the main mirror of a country
+          Customize for different distributions '''
+      country = None
+      i = server.find("://")
+      l = server.find(".archive.ubuntu.com")
+      if i != -1 and l != -1:
+          country = server[i+len("://"):l]
+      if self.countries.has_key(country):
+          # TRANSLATORS: %s is a country
+          return _("Server for %s") % \
+                 gettext.dgettext("iso_3166",
+                                  self.countries[country].rstrip()).rstrip()
+      else:
+          return("%s" % server.rstrip("/ "))
+
+  def get_server_list(self):
+    ''' Return a list of used and suggested servers '''
+    def compare_mirrors(mir1, mir2):
+        '''Helper function that handles comaprision of mirror urls
+           that could contain trailing slashes'''
+        return re.match(mir1.strip("/ "), mir2.rstrip("/ "))
+    
+    # Store all available servers:
+    # Name, URI, active
+    mirrors = []
+    if len(self.used_servers) < 1 or \
+       (len(self.used_servers) == 1 and \
+        compare_mirrors(self.used_servers[0], self.main_server)):
+        mirrors.append([_("Main server"), self.main_server, True]) 
+        mirrors.append([self._get_mirror_name(self.nearest_server), 
+                       self.nearest_server, False])
+    elif len(self.used_servers) == 1 and not \
+         compare_mirrors(self.used_servers[0], self.main_server):
+        mirrors.append([_("Main server"), self.main_server, False]) 
+        # Only one server is used
+        server = self.used_servers[0]
+
+        # Append the nearest server if it's not already used            
+        if not compare_mirrors(server, self.nearest_server):
+            mirrors.append([self._get_mirror_name(self.nearest_server), 
+                           self.nearest_server, False])
+        mirrors.append([self._get_mirror_name(server), server, True])
+
+    elif len(self.used_servers) > 1:
+        # More than one server is used. Since we don't handle this case
+        # in the user interface we set "custom servers" to true and 
+        # append a list of all used servers 
+        mirrors.append([_("Main server"), self.main_server, False])
+        mirrors.append([self._get_mirror_name(self.nearest_server), 
+                                        self.nearest_server, False])
+        mirrors.append([_("Custom servers"), None, True])
+        for server in self.used_servers:
+            if compare_mirrors(server, self.nearest_server) or\
+               compare_mirrors(server, self.main_server):
+                continue
+            elif not [self._get_mirror_name(server), server, False] in mirrors:
+                mirrors.append([self._get_mirror_name(server), server, False])
+
+    return mirrors
+
   def add_source(self, type=None, 
                  uri=None, dist=None, comps=None, comment=""):
     """
@@ -295,96 +386,31 @@
     else:
         return False
 
+  def _get_mirror_name(self, server):
+      ''' Try to get a human readable name for the main mirror of a country
+          Debian specific '''
+      country = None
+      i = server.find("://ftp.")
+      l = server.find(".debian.org")
+      if i != -1 and l != -1:
+          country = server[i+len("://ftp."):l]
+      if self.countries.has_key(country):
+          # TRANSLATORS: %s is a country
+          return _("Server for %s") % \
+                 gettext.dgettext("iso_3166",
+                                  self.countries[country].rstrip()).rstrip()
+      else:
+          return("%s" % server.rstrip("/ "))
+
+  def get_mirrors(self):
+    Distribution.get_mirrors(self,
+                             mirror_template="http://ftp.%s.debian.org/debian/";)
+
 class UbuntuDistribution(Distribution):
   ''' Class to support specific Ubuntu features '''
   def get_mirrors(self):
-    Distribution.get_mirrors(self)
-    # get a list of country codes and real names
-    self.countries = {}
-    try:
-        f = open("/usr/share/iso-codes/iso_3166.tab", "r")
-        lines = f.readlines()
-        for line in lines:
-            parts = line.split("\t")
-            self.countries[parts[0].lower()] = parts[1].strip()
-    except:
-        print "could not open file '%s'" % file
-    else:
-        f.close()
-
-    # try to guess the nearest mirror from the locale
-    self.country = None
-    self.country_code = None
-    locale = os.getenv("LANG", default="en.UK")
-    a = locale.find("_")
-    z = locale.find(".")
-    if z == -1:
-        z = len(locale)
-    country_code = locale[a+1:z].lower()
-    self.nearest_server = "http://%s.archive.ubuntu.com/ubuntu/"; % \
-                          country_code
-    if self.countries.has_key(country_code):
-        self.country = self.countries[country_code]
-        self.country_code = country_code
-
-  def get_server_list(self):
-    ''' Return a list of used and suggested servers '''
-    def compare_mirrors(mir1, mir2):
-        '''Helper function that handles comaprision of mirror urls
-           that could contain trailing slashes'''
-        return re.match(mir1.strip("/ "), mir2.rstrip("/ "))
-    def get_mirror_name(server):
-        ''' Try to get a human readable name for the main mirror of a country'''
-        country = None
-        i = server.find("://")
-        l = server.find(".archive.ubuntu.com")
-        if i != -1 and l != -1:
-            country = server[i+len("://"):l]
-        if self.countries.has_key(country):
-            # TRANSLATORS: %s is a country
-            return _("Server for %s") % \
-                   gettext.dgettext("iso_3166",
-                                    self.countries[country].rstrip()).rstrip()
-        else:
-            return("%s" % server.rstrip("/ "))
-    
-    # Store all available servers:
-    # Name, URI, active
-    mirrors = []
-    if len(self.used_servers) < 1 or \
-       (len(self.used_servers) == 1 and \
-        compare_mirrors(self.used_servers[0], self.main_server)):
-        mirrors.append([_("Main server"), self.main_server, True]) 
-        mirrors.append([get_mirror_name(self.nearest_server), 
-                       self.nearest_server, False])
-    elif len(self.used_servers) == 1 and not \
-         compare_mirrors(self.used_servers[0], self.main_server):
-        mirrors.append([_("Main server"), self.main_server, False]) 
-        # Only one server is used
-        server = self.used_servers[0]
-
-        # Append the nearest server if it's not already used            
-        if not compare_mirrors(server, self.nearest_server):
-            mirrors.append([get_mirror_name(self.nearest_server), 
-                           self.nearest_server, False])
-        mirrors.append([get_mirror_name(server), server, True])
-
-    elif len(self.used_servers) > 1:
-        # More than one server is used. Since we don't handle this case
-        # in the user interface we set "custom servers" to true and 
-        # append a list of all used servers 
-        mirrors.append([_("Main server"), self.main_server, False])
-        mirrors.append([get_mirror_name(self.nearest_server), 
-                                        self.nearest_server, False])
-        mirrors.append([_("Custom servers"), None, True])
-        for server in self.used_servers:
-            if compare_mirrors(server, self.nearest_server) or\
-               compare_mirrors(server, self.main_server):
-                continue
-            elif not [get_mirror_name(server), server, False] in mirrors:
-                mirrors.append([get_mirror_name(server), server, False])
-
-    return mirrors
+    Distribution.get_mirrors(self,
+                             mirror_template="http://%s.archive.ubuntu.com/ubuntu/";)
 
 def get_distro():
     ''' Check the currently used distribution and return the corresponding
diff -Nru --exclude '*.mo' --exclude '*.po' --exclude '*.pot' /tmp/KKyGU72DhZ/python-apt-0.7.2/debian/changelog /tmp/cEKADQ0COl/python-apt-0.7.2.1/debian/changelog
--- /tmp/KKyGU72DhZ/python-apt-0.7.2/debian/changelog	2007-06-10 23:32:27.000000000 +0100
+++ /tmp/cEKADQ0COl/python-apt-0.7.2.1/debian/changelog	2007-06-19 11:55:37.000000000 +0100
@@ -1,3 +1,12 @@
+python-apt (0.7.2.1) unstable; urgency=low
+
+  * aptsources/distro.py:
+  - generalized some code, bringing it into the Distribution
+    class, and wrote some missing methods for the DebianDistribution
+    one
+
+ -- Gustavo Noronha Silva <kov@debian.org>  Tue, 19 Jun 2007 11:55:37 +0100
+
 python-apt (0.7.2) unstable; urgency=low
 
   * build against the new apt

Reply to: