Add a parsedate() function which emulates rfc822.parsedate(), since python3
authorZac Medico <zmedico@gentoo.org>
Sun, 25 Oct 2009 23:57:44 +0000 (23:57 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 25 Oct 2009 23:57:44 +0000 (23:57 -0000)
doesn't have it.

svn path=/main/trunk/; revision=14729

bin/repoman

index 9a016896d040d7df173b69966c653b4a75b978c0..74bbdab922b20c9d5bf6512a1f78e0f586089fb2 100755 (executable)
@@ -32,11 +32,6 @@ try:
 except ImportError:
        from urllib import urlopen as urllib_request_urlopen
 
-try:
-       from rfc822 import parsedate
-except ImportError:
-       parsedate = None
-
 from io import StringIO
 from itertools import chain
 from stat import S_ISDIR, ST_CTIME
@@ -784,6 +779,33 @@ for x in qacats:
 xmllint_capable = False
 metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
 
+def parsedate(s):
+       """Parse a RFC 822 date and time string.
+       This is required for python3 compatibility, since the
+       rfc822.parsedate() function is not available."""
+
+       s_split = []
+       for x in s.upper().split():
+               for y in x.split(','):
+                       if y:
+                               s_split.append(y)
+
+       if len(s_split) != 6:
+               return None
+
+       # %a, %d %b %Y %H:%M:%S %Z
+       a, d, b, Y, H_M_S, Z = s_split
+
+       # Convert month to integer, since strptime %w is locale-dependent.
+       month_map = {'JAN':1, 'FEB':2, 'MAR':3, 'APR':4, 'MAY':5, 'JUN':6,
+               'JUL':7, 'AUG':8, 'SEP':9, 'OCT':10, 'NOV':11, 'DEC':12}
+       m = month_map.get(b)
+       if m is None:
+               return None
+       m = str(m).rjust(2, '0')
+
+       return time.strptime(':'.join((Y, m, d, H_M_S)), '%Y:%m:%d:%H:%M:%S')
+
 def fetch_metadata_dtd():
        """
        Fetch metadata.dtd if it doesn't exist or the ctime is older than
@@ -816,13 +838,7 @@ def fetch_metadata_dtd():
                        url_f = urllib_request_urlopen(metadata_dtd_uri)
                        msg_info = url_f.info()
                        last_modified = msg_info.get('last-modified')
-                       # Date parsing isn't supported in python3 since it has no
-                       # equivalent of the rfc822.parsedate() function.
-                       # TODO: Convert the last-modified field to locale-independent
-                       # format and then use time.strptime() to parse it.
-                       if parsedate is None:
-                               last_modified = None
-                       elif last_modified is not None:
+                       if last_modified is not None:
                                last_modified = parsedate(last_modified)
                                if last_modified is not None:
                                        last_modified = calendar.timegm(last_modified)