# HG changeset patch # User Rik # Date 1455154971 28800 # Node ID 101489515a70ee5e583a3d420b2edaab3928348a # Parent 933083fee7aedaaa6d6e804c09d8702aff5e0926 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. diff -r 933083fee7ae -r 101489515a70 scripts/pkg/private/get_forge_pkg.m --- 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, "
", "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