Description: Fix several kernel URLs.
Author: Johann Felix Soden <johfel@debian.org>

---
 ketchup |   11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

--- a/ketchup
+++ b/ketchup
@@ -119,7 +119,7 @@
     # every version must start with x.y, exit otherwise
     t = re.match(r'((\d+)\.\d+)', ver)
     if t == None:
-        error("Invalid tree version!")
+        error("Invalid tree version: %s!" % ver)
         sys.exit(-1)
 
     # linux versions >=3.0 use only the first digit to define the 'tree'
@@ -148,7 +148,8 @@
 
     #for -rc versions return the previous stable version
     if p: r = r - 1
-    if r == -1: r = 39
+    if r == -1 and tree(ver) == 3: r = 39
+    if r == -1 and tree(ver)>3: r = 19
     
     return r
 
@@ -202,6 +203,9 @@
     if t == 3 and r == 39:
         t = 2.6
 
+    if t == 4 and r == 19:
+        t = 3
+
     return "%s.%s" % (t, r)
 
 def base(ver):
@@ -308,8 +312,12 @@
     ra, rb = rev(a), rev(b)
     if (tree(a) == 3 and ra == 39): 
         ra = -1
+    if (tree(a) > 3 and ra == 19): 
+        ra = -1
     if (tree(b) == 3 and rb == 39):
         rb = -1
+    if (tree(b) > 3 and rb == 19):
+        rb = -1
     c = cmp(ra, rb)
     if c: return c
     c = cmp(int(post(a) or 0), int(post(b) or 0))
@@ -321,10 +329,19 @@
     return cmp(forknum(a), forknum(b))
 
 def last(url, pat="(.*/)"):
+    print url, pat
+    tokenize = re.compile(r'(\d+)|(\D+)').findall
+    def natural_sortkey(string):          
+            return tuple(int(num) if num else alpha for num, alpha in tokenize(string))
     n = None
+    res = []
     for l in urllib.urlopen(url).readlines():
-        m = re.search('(?i)<a href="%s">' % pat, l)
-        if m: n = m.group(1)
+        search_res = re.finditer('(?i)<a\s+href="%s"\s*>' % pat, l)
+        for m in search_res:
+            if ".." not in m.group(0): res.append(m.group(1))
+    if res:
+        res.sort(key=natural_sortkey)
+        n=res[-1]
     return n
 
 def latest_mmotm(url, pat):
@@ -332,15 +349,15 @@
         m = re.search('-EXTRAVERSION = (\S+)', l)
         if m: n = m.group(1)
 
-    latest = latest_dir(os.path.dirname(version_info['3-rc'][1]), ('patch-(.*%s).bz2' % n)) 
+    latest = latest_dir(os.path.dirname(version_info['4-rc'][1]), ('patch-(.*%s).xz' % n)) 
 
     return latest + "-mm1"
 
 def latest_ck(url, pat):
-    url = "http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/"
-    url += last(url)
-    part = fork(last(url))
-    stable = latest_dir(os.path.dirname(version_info['2.6'][1][0]), version_info['2.6'][2])
+    url = "http://ck.kolivas.org/patches/3.0/"
+    url += last(url,"(\d.*)/")
+    part = fork(last(url,"(\d.*)/"))
+    stable = latest_dir(os.path.dirname(version_info['3'][1][0]), version_info['3'][2])
 
     return stable + part
 
@@ -348,7 +365,8 @@
     url = "http://pf.natalenko.name/sources/"
     url += last(url)
     part = last(url,"(.*patch.*)")
-    part = re.search('\d+.\d+.\d+-pf\d+', part).group(0)
+    print "Part: ", part
+    part = re.search('\d+(.\d+)+-pf\d+', part).group(0)
     
     return part
 
@@ -726,24 +744,24 @@
 
 def install_nearest(ver):
     t = tree(ver)
-    tarballs = glob.glob(archive + "/linux-%s.*.tar.bz2" % t)
+    tarballs = glob.glob(archive + "/linux-%s.*.tar.xz" % t)
     list = []
 
     for f in tarballs:
-        m = re.match(r'.*/linux-(.*).tar.bz2$', f)
+        m = re.match(r'.*/linux-(.*).tar.xz$', f)
         v = m.group(1)
         d = abs(rev(v) - rev(ver))
         list.append((d, f, v))
     list.sort()
 
-    # ugly hack, upstream dir is /v3.0 (not v3)
+    # ugly hack, upstream dir is /v3.x (not v3)
     # FIXME: we assume that this will be the case for linux-4.0 and later releases
     # if not, we'll have to fix it again :)
     if t >= 3:
-        t += .0
+        t = "%s.x" % t
 
     if not list or (options["full-tarball"] and list[0][0]):
-        f = "linux-%s.tar.bz2" % ver
+        f = "linux-%s.tar.xz" % ver
         url = "%s/v%s/%s" % (kernel_url, t, f)
         url_longterm = "%s/v%s/longterm/v%s/%s" % (kernel_url, t, revbase(ver), f)
         f = archive + "/" + f
@@ -815,15 +833,25 @@
         if tree(a) > tree(b):
             for r in range(ra, -1, -1):
                 apply_patch("%s.%s" % (tree(a), r), -1)
-            for r in range(39, rb, -1):
-                apply_patch("%s.%s" % (tree(b), r), -1)
+            if tree(a)==2.6:
+                for r in range(39, rb, -1):
+                    apply_patch("%s.%s" % (tree(b), r), -1)
+            else:
+                for r in range(19, rb, -1):
+                    apply_patch("%s.%s" % (tree(b), r), -1)
         if tree(b) > tree(a):
-            for r in range(ra + 1, 40):
-                apply_patch("%s.%s" % (tree(a), r))
-            if rb != 39:
-                for r in range(0, rb + 1, 1):
-                    apply_patch("%s.%s" % (tree(b), r))
-
+            if tree(a)==2.6:
+                for r in range(ra + 1, 40):
+                    apply_patch("%s.%s" % (tree(a), r))
+                if rb != 39:
+                    for r in range(0, rb + 1, 1):
+                        apply_patch("%s.%s" % (tree(b), r))
+            else:
+                for r in range(ra + 1, 20):
+                    apply_patch("%s.%s" % (tree(a), r))
+                if rb != 19:
+                    for r in range(0, rb + 1, 1):
+                        apply_patch("%s.%s" % (tree(b), r))
         a = revbase(b)
 
         if post(b) and post(a) != post(b):
@@ -863,7 +891,7 @@
     '2.6': (latest_dir,
             ["%(kernel_url)s" + "/v2.6" + "/patch-%(prebase)s.bz2",
              "%(kernel_url)s" + "/v2.6/longterm/v%(revbase)s/patch-%(prebase)s.bz2"],
-            r'patch-(.*?).bz2',
+            r'linux-(.*?).tar.bz2',
             1, "2.6 kernel series"),
     '2.6-lt': (latest_dir_lt,
                ["%(kernel_url)s" + "/v2.6" + "/patch-%(prebase)s.bz2",
@@ -872,7 +900,7 @@
                1, "2.6 kernel series - update (only) to newer longterm stable releases (fourth number of 2.6 kernels)"),
     '2.6-rc': (latest_dir,
                "%(kernel_url)s" + "/v2.6" + "/testing/patch-%(prebase)s.bz2",
-               r'patch-(.*?).bz2',
+               r'linux-(.*?).tar.xz',
                1, "2.6 kernel series prereleases"),
     '2.6-rt': (latest_rt,
                ["%(kernel_url)s" + "/projects/rt/%(revbase)s/patch-%(full)s.bz2",
@@ -884,47 +912,71 @@
                + "/patch-%(full)s.bz2",
                r'patch-(.*?).bz2',
                0, "-pf kernel patchset"),
-    '2.6-ck': (latest_ck,
-               "%(kernel_url)s" + "/people/ck/patches/2.6" +
-               "/%(revbase)s/%(revbase)s%(fork)s/patch-%(revbase)s%(fork)s.bz2",
-               "", 0,
-               "Con Kolivas' -ck patchset"),
-    # use this for older -next releases (could be removed)
-    '2.6-next': (latest_dir,
-                 "%(kernel_url)s" + "/v2.6/next" + "/patch-v%(prebase)s%(fork)s.bz2",
-                 r'patch-v2.6(.*?).bz2',
-                 0, "2.6 linux-next tree"),
-    # current -next releases, for 3.x kernels
-    # FIXME: URL probably going to change (/v2.6/next -> /v3.0/next)
+    '3-pf': (latest_pf, 
+               "http://pf.natalenko.name/sources" + "/%(revbase)s" 
+               + "/patch-%(full)s.bz2",
+               r'patch-(.*?).bz2',
+               0, "-pf kernel patchset"),
+    '4-pf': (latest_pf, 
+               "http://pf.natalenko.name/sources" + "/%(revbase)s" 
+               + "/patch-%(full)s.bz2",
+               r'patch-(.*?).bz2',
+               0, "-pf kernel patchset"),
     '3-next': (latest_dir,
-                 "%(kernel_url)s" + "/v2.6/next" + "/patch-v%(prebase)s%(fork)s.bz2",
-                 r'patch-v(.*?).bz2',
+                 "%(kernel_url)s" + "/next" + "/patch-v%(prebase)s%(fork)s.xz",
+                 r'patch-v(.*?).xz',
                  1, "3 linux-next tree"),
-    '3-mm': (latest_mmotm, 
-               "http://userweb.kernel.org/~akpm/mmotm/broken-out.tar.gz",
+    '3-rc': (latest_dir,
+             "%(kernel_url)s" + "/v3.x" + "/testing/patch-%(prebase)s.xz",
+             r'patch-(.*?).xz',
+             1, "3.x stable kernel series prereleases"),
+    # current -next releases, for 4.x kernels
+    '4-next': (latest_dir,
+                 "%(kernel_url)s" + "/next" + "/patch-v%(prebase)s%(fork)s.xz",
+                 r'patch-v(.*?).xz',
+                 1, "4 linux-next tree"),
+    '4-mm': (latest_mmotm, 
+               "http://ozlabs.org/~akpm/mmotm/broken-out.tar.gz",
                r'broken-out.tar.gz',
                0, "-mmotm quilt patchset"),
-    '3-rc': (latest_dir,
-             "%(kernel_url)s" + "/v3.0" + "/testing/patch-%(prebase)s.bz2",
-             r'patch-(.*?).bz2',
+    '4-rc': (latest_dir,
+             "%(kernel_url)s" + "/v4.x" + "/testing/patch-%(prebase)s.xz",
+             r'patch-(.*?).xz',
              1, "current stable kernel series prereleases"),
     '3-rt': (latest_rt,
-             ["%(kernel_url)s" + "/projects/rt/%(revbase)s/patch-%(full)s.patch.bz2",
-              "%(kernel_url)s" + "/projects/rt/%(revbase)s/older/patch-%(full)s.patch.bz2",
+             ["%(kernel_url)s" + "/projects/rt/%(revbase)s/patch-%(full)s.patch.xz",
+              "%(kernel_url)s" + "/projects/rt/%(revbase)s/older/patch-%(full)s.patch.xz",
              ],
-             r'patch-(3(\.\d+)*-rt\d+).patch.bz2', # TODO: add git-based releases
+             r'patch-(3(\.\d+)*-rt\d+).patch.xz', # TODO: add git-based releases
              1, "PREEMPT_RT real-time kernel (only based directly on stable and -rc kernels.)"),
+    '3-ck': (latest_ck,
+            "http://ck.kolivas.org/patches/3.0/" +
+            "/%(revbase)s/%(revbase)s%(fork)s/patch-%(revbase)s%(fork)s.xz",
+            "", 0,
+            "Con Kolivas' -ck patchset"),
     '4-rt': (latest_rt,
-             ["%(kernel_url)s" + "/projects/rt/%(revbase)s/patch-%(full)s.patch.bz2",
-              "%(kernel_url)s" + "/projects/rt/%(revbase)s/older/patch-%(full)s.patch.bz2",
+             ["%(kernel_url)s" + "/projects/rt/%(revbase)s/patch-%(full)s.patch.xz",
+              "%(kernel_url)s" + "/projects/rt/%(revbase)s/older/patch-%(full)s.patch.xz",
              ],
-             r'patch-([456](\.\d+)*-rt\d+).patch.bz2', # TODO: add git-based releases
+             r'patch-([456](\.\d+)*-rt\d+).patch.xz', # TODO: add git-based releases
              1, "PREEMPT_RT real-time kernel (only based directly on stable and -rc kernels.)"),
+    '3-lt': (latest_dir_lt,
+               "%(kernel_url)s" + "/v3.x" + "/patch-%(prebase)s.xz",
+               r'patch-(.*?).xz',
+               1, "3.x kernel series - update (only) to newer longterm stable releases (third number of 3.x kernels)"),
+    '4-lt': (latest_dir_lt,
+               "%(kernel_url)s" + "/v4.x" + "/patch-%(prebase)s.xz",
+               r'patch-(.*?).xz',
+               1, "4.x kernel series - update (only) to newer longterm stable releases (third number of 4.x kernels)"),
     '3': (latest_dir,
-          ["%(kernel_url)s" + "/v3.0" + "/patch-%(prebase)s.bz2",
-           "%(kernel_url)s" + "/v3.0/longterm/v%(revbase)s/patch-%(prebase)s.bz2"],
-          r'patch-(.*?).bz2',
+          ["%(kernel_url)s" + "/v3.x" + "/patch-%(prebase)s.xz"],
+          r'patch-(.*?).xz',
+          1, "last stable kernel series"),
+    '4': (latest_dir,
+          ["%(kernel_url)s" + "/v4.x" + "/patch-%(prebase)s.xz"],
+          r'patch-(.*?).xz',
           1, "current stable kernel series"),
+
     }
 
 # Override defaults with ~/.ketchuprc which is just a Python script
