Mercurial > octave
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