changeset 21246:101489515a70

get_forge_pkg.m: Fix bad nam similarity matching for -forge packages (bug #47102). * get_forge_pkg.m: Use URL "list_packages.php" which contains machine-readable list of Octave-Forge packages. Use new similarity matching algorithm based on Huffman distance if name is not a valid package name.
author Rik <rik@octave.org>
date Wed, 10 Feb 2016 17:42:51 -0800
parents 933083fee7ae
children 7be239ae42c8
files scripts/pkg/private/get_forge_pkg.m
diffstat 1 files changed, 20 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/pkg/private/get_forge_pkg.m	Wed Feb 10 15:00:22 2016 -0500
+++ b/scripts/pkg/private/get_forge_pkg.m	Wed Feb 10 17:42:51 2016 -0800
@@ -61,21 +61,28 @@
     endif
   else
     ## Try get the list of all packages.
-    [html, succ] = urlread ("http://packages.octave.org/packages.php");
-    if (succ)
-      t = regexp (html, "<div class=""package"" id=""(\\w+)"">", "tokens");
-      t = horzcat (t{:});
-      if (any (strcmp (t, name)))
-        error ("get_forge_pkg: package NAME exists, but index page not available");
-      else
-        ## Try a simplistic method to determine close names.
-        dist = cellfun (@(n) length (setdiff (name, n)), t);
-        [~, i] = min (dist);
-        error ("get_forge_pkg: package not found: ""%s"". Maybe you meant ""%s?""", name, t{i});
-      endif
-    else
+    [html, succ] = urlread ("http://packages.octave.org/list_packages.php");
+    if (! succ)
       error ("get_forge_pkg: could not read URL, please verify internet connection");
     endif
+    t = strsplit (html);
+    if (any (strcmp (t, name)))
+      error ("get_forge_pkg: package NAME exists, but index page not available");
+    endif
+    ## Try a simplistic method to determine similar names.
+    function d = fdist (x)
+      len1 = length (name);
+      len2 = length (x);
+      if (len1 <= len2)
+        d = sum (abs (name(1:len1) - x(1:len1))) + sum (x(len1+1:end));
+      else
+        d = sum (abs (name(1:len2) - x(1:len2))) + sum (name(len2+1:end));
+      endif
+    endfunction
+    dist = cellfun ("fdist", t);
+    [~, i] = min (dist);
+    error ("get_forge_pkg: package not found: ""%s"".  Maybe you meant ""%s?""",
+           name, t{i});
   endif
 
 endfunction