diff --git a/octave-2.9.14-pkg.patch b/octave-2.9.14-pkg.patch new file mode 100644 index 0000000..b47d7b9 --- /dev/null +++ b/octave-2.9.14-pkg.patch @@ -0,0 +1,977 @@ +*** ./scripts/pkg/pkg.m.orig2 2007-08-23 18:14:51.000000000 +0200 +--- ./scripts/pkg/pkg.m 2007-09-22 02:36:01.022097578 +0200 +*************** +*** 116,121 **** +--- 116,128 ---- + ## @example + ## p = pkg prefix + ## @end example ++ ## ++ ## The location in which to install the architecture dependent files can be ++ ## independent specified with an addition argument. For example ++ ## ++ ## @example ++ ## pkg prefix ~/my_octave_packages ~/my_octave_packages_for_my_pc ++ ## @end example + ## @item local_list + ## Set the file in which to look for information on the locally + ## installed packages. Locally installed packages are those that are +*************** +*** 173,196 **** + ## Installation prefix (XXX: what should these be on windows?) + persistent user_prefix = false; + persistent prefix = -1; + persistent local_list = tilde_expand (fullfile("~", ".octave_packages")); + persistent global_list = fullfile (OCTAVE_HOME (), "share", "octave", + "octave_packages"); + mlock (); + +! if (ispc () && ! isunix ()) +! global_install = 1; +! else +! global_install = (geteuid() == 0); +! endif + + if (prefix == -1) + if (global_install) + prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages"); + else + prefix = fullfile ("~", "octave"); + endif + prefix = tilde_expand (prefix); + endif + + ## Handle input +--- 180,203 ---- + ## Installation prefix (XXX: what should these be on windows?) + persistent user_prefix = false; + persistent prefix = -1; ++ persistent archprefix = -1; + persistent local_list = tilde_expand (fullfile("~", ".octave_packages")); + persistent global_list = fullfile (OCTAVE_HOME (), "share", "octave", + "octave_packages"); + mlock (); + +! global_install = issuperuser (); + + if (prefix == -1) + if (global_install) + prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages"); ++ archprefix = fullfile (OCTAVE_HOME (), "libexec", "octave", "packages"); + else + prefix = fullfile ("~", "octave"); ++ archprefix = prefix; + endif + prefix = tilde_expand (prefix); ++ archprefix = tilde_expand (archprefix); + endif + + ## Handle input +*************** +*** 222,230 **** + if (! user_prefix) + prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages"); + endif +! case {"list", "install", "uninstall", "load", "unload", ... +! "prefix", "local_list", "global_list", "rebuild", "build"} +! if (strcmp (action,"none")) + action = varargin{i}; + else + error ("more than one action specified"); +--- 229,237 ---- + if (! user_prefix) + prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages"); + endif +! case {"list", "install", "uninstall", "load", "unload", "prefix", ... +! "local_list", "global_list", "rebuild", "build"} +! if (strcmp (action, "none")) + action = varargin{i}; + else + error ("more than one action specified"); +*************** +*** 252,258 **** + if (length (files) == 0) + error ("you must specify at least one filename when calling 'pkg install'"); + endif +! install (files, deps, auto, prefix, verbose, local_list, + global_list, global_install); + + case "uninstall" +--- 259,265 ---- + if (length (files) == 0) + error ("you must specify at least one filename when calling 'pkg install'"); + endif +! install (files, deps, auto, prefix, archprefix, verbose, local_list, + global_list, global_install); + + case "uninstall" +*************** +*** 276,292 **** + + case "prefix" + if (length (files) == 0 && nargout == 0) +! disp (prefix); +! elseif (length (files) == 0 && nargout == 1) + local_packages = prefix; +! elseif (length (files) == 1 && nargout <= 1 && ischar (files{1})) + prefix = files{1}; +- ## if (!strcmp(prefix(end), filesep)) +- ## prefix(end+1) = filesep; +- ## endif + prefix = absolute_pathname (prefix); + local_packages = prefix; + user_prefix = true; + else + error ("you must specify a prefix directory, or request an output argument"); + endif +--- 283,309 ---- + + case "prefix" + if (length (files) == 0 && nargout == 0) +! printf ("Installation prefix: %s\n", prefix); +! printf ("Architecture dependent prefix: %s\n", archprefix); +! elseif (length (files) == 0 && nargout >= 1) + local_packages = prefix; +! global_packages = archprefix; +! elseif (length (files) >= 1 && nargout <= 2 && ischar (files{1})) + prefix = files{1}; + prefix = absolute_pathname (prefix); + local_packages = prefix; + user_prefix = true; ++ if (length (files) >= 2 && ischar (files{2})) ++ archprefix = files{2}; ++ try ++ archprefix = absolute_pathname (archprefix); ++ catch ++ mkdir (archprefix); ++ warning ("creating the directory %s\n", archprefix); ++ archprefix = absolute_pathname (archprefix); ++ end_try_catch ++ global_packages = archprefix; ++ endif + else + error ("you must specify a prefix directory, or request an output argument"); + endif +*************** +*** 327,340 **** + + case "rebuild" + if (global_install) +! global_packages = rebuild (prefix, global_list, files, auto, verbose); + global_packages = save_order (global_packages); + save (global_list, "global_packages"); + if (nargout > 0) + local_packages = global_packages; + endif + else +! local_packages = rebuild (prefix, local_list, files, auto, verbose); + local_packages = save_order (local_packages); + save (local_list, "local_packages"); + if (nargout == 0) +--- 344,359 ---- + + case "rebuild" + if (global_install) +! global_packages = rebuild (prefix, archprefix, global_list, files, +! auto, verbose); + global_packages = save_order (global_packages); + save (global_list, "global_packages"); + if (nargout > 0) + local_packages = global_packages; + endif + else +! local_packages = rebuild (prefix, archprefix, local_list, files, auto, +! verbose); + local_packages = save_order (local_packages); + save (local_list, "local_packages"); + if (nargout == 0) +*************** +*** 353,359 **** + endswitch + endfunction + +! function descriptions = rebuild (prefix, list, files, auto, verbose) + if (isempty (files)) + [dirlist, err, msg] = readdir (prefix); + if (err) +--- 372,378 ---- + endswitch + endfunction + +! function descriptions = rebuild (prefix, archprefix, list, files, auto, verbose) + if (isempty (files)) + [dirlist, err, msg] = readdir (prefix); + if (err) +*************** +*** 380,385 **** +--- 399,406 ---- + if (exist (descfile, "file")) + desc = get_description (descfile); + desc.dir = fullfile (prefix, dirlist{k}); ++ desc.archprefix = fullfile (archprefix, strcat (desc.name, "-", ++ desc.version)); + if (auto != 0) + if (exist (fullfile (desc.dir, "packinfo", ".autoload"), "file")) + unlink (fullfile (desc.dir, "packinfo", ".autoload")); +*************** +*** 450,456 **** + endif + files(1) = []; + buildlist = fullfile (builddir, "octave_packages"); +! install (files, handle_deps, autoload, installdir, verbose, + buildlist, "", false); + unwind_protect + repackage (builddir, buildlist); +--- 471,477 ---- + endif + files(1) = []; + buildlist = fullfile (builddir, "octave_packages"); +! install (files, handle_deps, autoload, installdir, installdir, verbose, + buildlist, "", false); + unwind_protect + repackage (builddir, buildlist); +*************** +*** 465,471 **** + end_unwind_protect + endfunction + +! function install (files, handle_deps, autoload, prefix, verbose, local_list, global_list, global_install) + + # Check that the directory in prefix exist. If it doesn't: create it! + if (! exist (prefix, "dir")) +--- 486,493 ---- + end_unwind_protect + endfunction + +! function install (files, handle_deps, autoload, prefix, archprefix, verbose, +! local_list, global_list, global_install) + + # Check that the directory in prefix exist. If it doesn't: create it! + if (! exist (prefix, "dir")) +*************** +*** 491,497 **** + ## Uncompress the packages and read the DESCRIPTION files + tmpdirs = packdirs = descriptions = {}; + try +- + ## Warn about non existent files + for i = 1:length (files) + if (isempty (glob(files{i}))) +--- 513,518 ---- +*************** +*** 549,560 **** + [dummy, nm] = fileparts (tgz); + if ((length (nm) >= length (desc.name)) + && ! strcmp (desc.name, nm(1:length(desc.name)))) +! error ("package name '%s' doesn't correspond to its filename '%s'", desc.name, nm); + endif + + ## Set default installation directory + desc.dir = fullfile (prefix, strcat (desc.name, "-", desc.version)); + + ## Save desc + descriptions{end+1} = desc; + +--- 570,586 ---- + [dummy, nm] = fileparts (tgz); + if ((length (nm) >= length (desc.name)) + && ! strcmp (desc.name, nm(1:length(desc.name)))) +! error ("package name '%s' doesn't correspond to its filename '%s'", +! desc.name, nm); + endif + + ## Set default installation directory + desc.dir = fullfile (prefix, strcat (desc.name, "-", desc.version)); + ++ ## Set default architectire dependent installation directory ++ desc.archprefix = fullfile (archprefix, strcat (desc.name, "-", ++ desc.version)); ++ + ## Save desc + descriptions{end+1} = desc; + +*************** +*** 656,665 **** + for i = 1:length (descriptions) + desc = descriptions{i}; + pdir = packdirs{i}; +! copy_files (desc, pdir); +! create_pkgadddel (desc, pdir, "PKG_ADD"); +! create_pkgadddel (desc, pdir, "PKG_DEL"); +! finish_installation (desc, pdir) + endfor + catch + ## Something went wrong, delete tmpdirs +--- 682,691 ---- + for i = 1:length (descriptions) + desc = descriptions{i}; + pdir = packdirs{i}; +! copy_files (desc, pdir, global_install); +! create_pkgadddel (desc, pdir, "PKG_ADD", global_install); +! create_pkgadddel (desc, pdir, "PKG_DEL", global_install); +! finish_installation (desc, pdir, global_install) + endfor + catch + ## Something went wrong, delete tmpdirs +*************** +*** 668,673 **** +--- 694,700 ---- + endfor + for i = 1:length (descriptions) + rm_rf (descriptions{i}.dir); ++ rm_rf (getarchdir (descriptions{i})); + endfor + rethrow (lasterror ()); + end_try_catch +*************** +*** 675,683 **** + ## Check if the installed directory is empty. If it is remove it + ## from the list + for i = length (descriptions):-1:1 +! if (dirempty (descriptions{i}.dir, {"packinfo", "doc"})) + warning ("package %s is empty\n", descriptions{i}.name); + rm_rf (descriptions{i}.dir); + descriptions(i) = []; + endif + endfor +--- 702,712 ---- + ## Check if the installed directory is empty. If it is remove it + ## from the list + for i = length (descriptions):-1:1 +! if (dirempty (descriptions{i}.dir, {"packinfo", "doc"}) && +! dirempty (getarchdir (descriptions{i}))) + warning ("package %s is empty\n", descriptions{i}.name); + rm_rf (descriptions{i}.dir); ++ rm_rf (getarchdir (descriptions{i})); + descriptions(i) = []; + endif + endfor +*************** +*** 738,744 **** + idx (end + 1) = i; + endif + endfor +! load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst); + endif + endfunction + +--- 767,774 ---- + idx (end + 1) = i; + endif + endfor +! load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst, +! global_install); + endif + endfunction + +*************** +*** 826,833 **** + ## Do the actual deletion + if (desc.loaded) + rmpath (desc.dir); +! if (exist (fullfile (desc.dir, getarch()), "dir")) +! rmpath (fullfile (desc.dir, getarch ())); + endif + endif + if (exist (desc.dir, "dir")) +--- 856,863 ---- + ## Do the actual deletion + if (desc.loaded) + rmpath (desc.dir); +! if (exist (getarchdir (desc))) +! rmpath (getarchdir (desc)); + endif + endif + if (exist (desc.dir, "dir")) +*************** +*** 835,840 **** +--- 865,877 ---- + if (status != 1) + error ("couldn't delete directory %s: %s", desc.dir, msg); + endif ++ [status, msg] = rm_rf (getarchdir (desc)); ++ if (status != 1) ++ error ("couldn't delete directory %s: %s", getarchdir (desc), msg); ++ endif ++ if (dirempty (desc.archprefix)) ++ rm_rf (desc.archprefix); ++ endif + else + warning ("directory %s previously lost", desc.dir); + endif +*************** +*** 894,900 **** + if (exist (fullfile (pack.name, "inst", "bin"), "dir")) + movefile (fullfile (pack.name, "inst", "bin"), pack.name); + endif +! archdir = fullfile (pack.name, "inst", getarch ()); + if (exist (archdir, "dir")) + if (exist (fullfile (pack.name, "inst", "PKG_ADD"), "file")) + unlink (fullfile (pack.name, "inst", "PKG_ADD")); +--- 931,938 ---- + if (exist (fullfile (pack.name, "inst", "bin"), "dir")) + movefile (fullfile (pack.name, "inst", "bin"), pack.name); + endif +! archdir = fullfile (pack.archprefix, strcat (pack.name, "-", +! pack.version), getarch ()); + if (exist (archdir, "dir")) + if (exist (fullfile (pack.name, "inst", "PKG_ADD"), "file")) + unlink (fullfile (pack.name, "inst", "PKG_ADD")); +*************** +*** 1123,1138 **** + endif + endfunction + +! function create_pkgadddel (desc, packdir, nm) + instpkg = fullfile (desc.dir, nm); + instfid = fopen (instpkg, "wt"); + ## If it is exists, most of the PKG_* file should go into the + ## architecture dependent directory so that the autoload/mfilename + ## commands work as expected. The only part that doesn't is the + ## part in the main directory. +! if (exist (fullfile (desc.dir, getarch ()), "dir")) +! archpkg = fullfile (desc.dir, getarch (), nm); +! archfid = fopen (archpkg, "wt"); + else + archpkg = instpkg; + archfid = instfid; +--- 1161,1178 ---- + endif + endfunction + +! function create_pkgadddel (desc, packdir, nm, global_install) + instpkg = fullfile (desc.dir, nm); + instfid = fopen (instpkg, "wt"); + ## If it is exists, most of the PKG_* file should go into the + ## architecture dependent directory so that the autoload/mfilename + ## commands work as expected. The only part that doesn't is the + ## part in the main directory. +! archdir = fullfile (getarchprefix (desc), strcat (desc.name, "-", +! desc.version), getarch ()); +! if (exist (getarchdir (desc, global_install), "dir")) +! archpkg = fullfile (getarchdir (desc, global_install), nm); +! archfid = fopen (archpkg, "at"); + else + archpkg = instpkg; + archfid = instfid; +*************** +*** 1186,1192 **** + endif + endfunction + +! function copy_files (desc, packdir, bindir) + ## Create the installation directory + if (! exist (desc.dir, "dir")) + [status, output] = mkdir (desc.dir); +--- 1226,1232 ---- + endif + endfunction + +! function copy_files (desc, packdir, global_install) + ## Create the installation directory + if (! exist (desc.dir, "dir")) + [status, output] = mkdir (desc.dir); +*************** +*** 1196,1201 **** +--- 1236,1243 ---- + endif + endif + ++ octfiledir = getarchdir (desc); ++ + ## Copy the files from "inst" to installdir + instdir = fullfile (packdir, "inst"); + if (! dirempty (instdir)) +*************** +*** 1204,1209 **** +--- 1246,1300 ---- + rm_rf (desc.dir); + error ("couldn't copy files to the installation directory"); + endif ++ if (exist (fullfile (desc.dir, getarch ()), "dir") && ++ ! strcmp (fullfile (desc.dir, getarch ()), octfiledir)) ++ if (! exist (octfiledir, "dir")) ++ ## Can be required to create upto three levels of dirs ++ octm1 = fileparts (octfiledir); ++ if (! exist (octm1, "dir")) ++ octm2 = fileparts (octm1); ++ if (! exist (octm2, "dir")) ++ octm3 = fileparts (octm2); ++ if (! exist (octm3, "dir")) ++ [status, output] = mkdir (octm3); ++ if (status != 1) ++ rm_rf (desc.dir); ++ error ("couldn't create installation directory %s : %s", ++ octm3, output); ++ endif ++ endif ++ [status, output] = mkdir (octm2); ++ if (status != 1) ++ rm_rf (desc.dir); ++ error ("couldn't create installation directory %s : %s", ++ octm2, output); ++ endif ++ endif ++ [status, output] = mkdir (octm1); ++ if (status != 1) ++ rm_rf (desc.dir); ++ error ("couldn't create installation directory %s : %s", ++ octm1, output); ++ endif ++ endif ++ [status, output] = mkdir (octfiledir); ++ if (status != 1) ++ rm_rf (desc.dir); ++ error ("couldn't create installation directory %s : %s", ++ octfiledir, output); ++ endif ++ endif ++ [status, output] = movefile (fullfile (desc.dir, getarch (), "*"), ++ octfiledir); ++ rm_rf (fullfile (desc.dir, getarch ())); ++ ++ if (status != 1) ++ rm_rf (desc.dir); ++ rm_rf (octfiledir); ++ error ("couldn't copy files to the installation directory"); ++ endif ++ endif ++ + endif + + ## Create the "packinfo" directory +*************** +*** 1211,1231 **** + [status, msg] = mkdir (packinfo); + if (status != 1) + rm_rf (desc.dir); + error ("couldn't create packinfo directory: %s", msg); + endif + + ## Copy DESCRIPTION + [status, output] = copyfile (fullfile (packdir, "DESCRIPTION"), packinfo); + if (status != 1) +! rm_rf (desc.dir); +! error ("couldn't copy DESCRIPTION: %s", output); + endif + + ## Copy COPYING + [status, output] = copyfile (fullfile (packdir, "COPYING"), packinfo); + if (status != 1) +! rm_rf (desc.dir); +! error ("couldn't copy COPYING: %s", output); + endif + + ## If the file ChangeLog exists, copy it +--- 1302,1325 ---- + [status, msg] = mkdir (packinfo); + if (status != 1) + rm_rf (desc.dir); ++ rm_rf (octfiledir); + error ("couldn't create packinfo directory: %s", msg); + endif + + ## Copy DESCRIPTION + [status, output] = copyfile (fullfile (packdir, "DESCRIPTION"), packinfo); + if (status != 1) +! rm_rf (desc.dir); +! rm_rf (octfiledir); +! error ("couldn't copy DESCRIPTION: %s", output); + endif + + ## Copy COPYING + [status, output] = copyfile (fullfile (packdir, "COPYING"), packinfo); + if (status != 1) +! rm_rf (desc.dir); +! rm_rf (octfiledir); +! error ("couldn't copy COPYING: %s", output); + endif + + ## If the file ChangeLog exists, copy it +*************** +*** 1234,1239 **** +--- 1328,1334 ---- + [status, output] = copyfile (fChangeLog, packinfo); + if (status != 1) + rm_rf (desc.dir); ++ rm_rf (octfiledir); + error ("couldn't copy ChangeLog file: %s", output); + endif + endif +*************** +*** 1244,1257 **** + [status, output] = copyfile (fINDEX, packinfo); + if (status != 1) + rm_rf (desc.dir); + error ("couldn't copy INDEX file: %s", output); + endif + else + try + write_INDEX (desc, fullfile (packdir, "inst"), +! fullfile (packinfo, "INDEX")); + catch + rm_rf (desc.dir); + rethrow (lasterror ()); + end_try_catch + endif +--- 1339,1354 ---- + [status, output] = copyfile (fINDEX, packinfo); + if (status != 1) + rm_rf (desc.dir); ++ rm_rf (octfiledir); + error ("couldn't copy INDEX file: %s", output); + endif + else + try + write_INDEX (desc, fullfile (packdir, "inst"), +! fullfile (packinfo, "INDEX"), global_install); + catch + rm_rf (desc.dir); ++ rm_rf (octfiledir); + rethrow (lasterror ()); + end_try_catch + endif +*************** +*** 1262,1267 **** +--- 1359,1365 ---- + [status, output] = copyfile (fon_uninstall, packinfo); + if (status != 1) + rm_rf (desc.dir); ++ rm_rf (octfiledir); + error ("couldn't copy on_uninstall.m: %s", output); + endif + endif +*************** +*** 1269,1285 **** + ## Is there a doc/ directory that needs to be installed + docdir = fullfile (packdir, "doc"); + if (exist (docdir, "dir") && ! dirempty (docdir)) +! [status, output] = copyfile (docdir, desc.dir); + endif + + ## Is there a bin/ directory that needs to be installed + bindir = fullfile (packdir, "bin"); + if (exist (bindir, "dir") && ! dirempty (bindir)) +! [status, output] = copyfile (bindir, desc.dir); + endif + endfunction + +! function finish_installation (desc, packdir) + ## Is there a post-install to call? + if (exist (fullfile (packdir, "post_install.m"), "file")) + wd = pwd (); +--- 1367,1383 ---- + ## Is there a doc/ directory that needs to be installed + docdir = fullfile (packdir, "doc"); + if (exist (docdir, "dir") && ! dirempty (docdir)) +! [status, output] = copyfile (docdir, desc.dir); + endif + + ## Is there a bin/ directory that needs to be installed + bindir = fullfile (packdir, "bin"); + if (exist (bindir, "dir") && ! dirempty (bindir)) +! [status, output] = copyfile (bindir, desc.dir); + endif + endfunction + +! function finish_installation (desc, packdir, global_install) + ## Is there a post-install to call? + if (exist (fullfile (packdir, "post_install.m"), "file")) + wd = pwd (); +*************** +*** 1290,1295 **** +--- 1388,1394 ---- + catch + cd (wd); + rm_rf (desc.dir); ++ rm_rf (getarchdir (desc), global_install); + rethrow (lasterror ()); + end_try_catch + endif +*************** +*** 1470,1476 **** + ## 'desc' describes the package. + ## 'dir' is the 'inst' direcotyr in temporary directory. + ## 'INDEX' is the name (including path) of resulting INDEX file. +! function write_INDEX (desc, dir, INDEX) + ## Get names of functions in dir + [files, err, msg] = readdir (dir); + if (err) +--- 1569,1575 ---- + ## 'desc' describes the package. + ## 'dir' is the 'inst' direcotyr in temporary directory. + ## 'INDEX' is the name (including path) of resulting INDEX file. +! function write_INDEX (desc, dir, INDEX, global_install) + ## Get names of functions in dir + [files, err, msg] = readdir (dir); + if (err) +*************** +*** 1478,1485 **** + endif + + ## Check for architecture dependent files +! arch = getarch(); +! tmpdir = fullfile (dir, arch); + if (exist (tmpdir, "dir")) + [files2, err, msg] = readdir (tmpdir); + if (err) +--- 1577,1583 ---- + endif + + ## Check for architecture dependent files +! tmpdir = getarchdir (desc); + if (exist (tmpdir, "dir")) + [files2, err, msg] = readdir (tmpdir); + if (err) +*************** +*** 1718,1724 **** + endif + + ## Load the packages, but take care of the ordering of dependencies +! load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst); + endfunction + + function unload_packages (files, handle_deps, local_list, global_list) +--- 1816,1822 ---- + endif + + ## Load the packages, but take care of the ordering of dependencies +! load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst, true); + endfunction + + function unload_packages (files, handle_deps, local_list, global_list) +*************** +*** 1739,1773 **** + ## unload all + if (length (files) == 1 && strcmp (files{1}, "all")) + dirs = pdirs; + ## unload package_name1 ... + else + dirs = {}; + for i = 1:length (files) +! idx = strcmp (pnames, files{i}); + if (! any (idx)) + error ("package %s is not installed", files{i}); + endif +! dirs{end+1} = pdirs{idx}; + endfor + endif + + ## Check for architecture dependent directories +- arch = getarch(); + archdirs = {}; + for i = 1:length (dirs) +! tmpdir = fullfile (dirs{i}, arch); + if (exist (tmpdir, "dir")) + archdirs{end + 1} = dirs{i}; + archdirs{end + 1} = tmpdir; + endif + endfor +- if (length (archdirs) > 0) +- dirs = archdirs; +- endif + + ## Unload the packages +! for i = 1:length (dirs) +! d = dirs{i}; + idx = strcmp (p, d); + if (any (idx)) + rmpath (d); +--- 1837,1872 ---- + ## unload all + if (length (files) == 1 && strcmp (files{1}, "all")) + dirs = pdirs; ++ desc = installed_pkgs_lst; + ## unload package_name1 ... + else + dirs = {}; ++ desc = {}; + for i = 1:length (files) +! idx = strcmp (pnames, files {i}); + if (! any (idx)) + error ("package %s is not installed", files{i}); + endif +! dirs {end + 1} = pdirs {idx}; +! desc {end + 1} = installed_pkgs_lst {idx}; + endfor + endif + + ## Check for architecture dependent directories + archdirs = {}; + for i = 1:length (dirs) +! tmpdir = getarchdir (desc {i}); + if (exist (tmpdir, "dir")) + archdirs{end + 1} = dirs{i}; + archdirs{end + 1} = tmpdir; ++ else ++ archdirs{end+ 1} = dirs {i}; + endif + endfor + + ## Unload the packages +! for i = 1:length (archdirs) +! d = archdirs{i}; + idx = strcmp (p, d); + if (any (idx)) + rmpath (d); +*************** +*** 1777,1789 **** + endfunction + + function [status_out, msg_out] = rm_rf (dir) +! crr = confirm_recursive_rmdir (); +! unwind_protect +! confirm_recursive_rmdir (false); +! [status, msg] = rmdir (dir, "s"); +! unwind_protect_cleanup +! confirm_recursive_rmdir (crr); +! end_unwind_protect + if (nargout > 0) + status_out = status; + endif +--- 1876,1893 ---- + endfunction + + function [status_out, msg_out] = rm_rf (dir) +! if (exist (dir)) +! crr = confirm_recursive_rmdir (); +! unwind_protect +! confirm_recursive_rmdir (false); +! [status, msg] = rmdir (dir, "s"); +! unwind_protect_cleanup +! confirm_recursive_rmdir (crr); +! end_unwind_protect +! else +! status = 1; +! msg = ""; +! endif + if (nargout > 0) + status_out = status; + endif +*************** +*** 1793,1818 **** + endfunction + + function emp = dirempty (nm, ign) +! if (nargin < 2) +! ign = {".", ".."}; +! else +! ign = [{".", ".."}, ign]; +! endif +! l = dir (nm); +! for i = 1:length (l) +! found = false; +! for j = 1:length (ign) +! if (strcmp (l(i).name, ign{j})) +! found = true; +! break; + endif + endfor +! if (! found) +! emp = false; +! return +! endif +! endfor +! emp = true; + endfunction + + function arch = getarch () +--- 1897,1926 ---- + endfunction + + function emp = dirempty (nm, ign) +! if (exist (nm, "dir")) +! if (nargin < 2) +! ign = {".", ".."}; +! else +! ign = [{".", ".."}, ign]; +! endif +! l = dir (nm); +! for i = 1:length (l) +! found = false; +! for j = 1:length (ign) +! if (strcmp (l(i).name, ign{j})) +! found = true; +! break; +! endif +! endfor +! if (! found) +! emp = false; +! return + endif + endfor +! emp = true; +! else +! emp = true; +! endif + endfunction + + function arch = getarch () +*************** +*** 1821,1826 **** +--- 1929,1955 ---- + arch = _arch; + endfunction + ++ function archprefix = getarchprefix (desc, global_install) ++ if ((nargin == 2 && global_install) || (nargin < 2 && issuperuser ())) ++ archprefix = fullfile (octave_config_info ("libexecdir"), "octave", ++ "packages", strcat(desc.name, "-", desc.version)); ++ else ++ archprefix = desc.dir; ++ endif ++ endfunction ++ ++ function archdir = getarchdir (desc) ++ archdir = fullfile (desc.archprefix, getarch()); ++ endfunction ++ ++ function s = issuperuser () ++ if ((ispc () && ! isunix ()) || (geteuid() == 0)) ++ s = true; ++ else ++ s = false; ++ endif ++ endfunction ++ + function [status, output] = shell (cmd) + persistent have_sh; + +*************** +*** 1879,1887 **** + newdesc(idx) = []; + endfunction + +! function load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst) + idx = load_package_dirs (idx, [], handle_deps, installed_pkgs_lst); +- arch = getarch (); + dirs = {}; + execpath = EXEC_PATH (); + for i = idx; +--- 2008,2016 ---- + newdesc(idx) = []; + endfunction + +! function load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst, +! global_install) + idx = load_package_dirs (idx, [], handle_deps, installed_pkgs_lst); + dirs = {}; + execpath = EXEC_PATH (); + for i = idx; +*************** +*** 1890,1896 **** + if (exist (fullfile (dirs{end}, "bin"), "dir")) + execpath = strcat (fullfile(dirs{end}, "bin"), ":", execpath); + endif +! tmpdir = fullfile (ndir, arch); + if (exist (tmpdir, "dir")) + dirs{end + 1} = tmpdir; + endif +--- 2019,2025 ---- + if (exist (fullfile (dirs{end}, "bin"), "dir")) + execpath = strcat (fullfile(dirs{end}, "bin"), ":", execpath); + endif +! tmpdir = getarchdir (installed_pkgs_lst {i}); + if (exist (tmpdir, "dir")) + dirs{end + 1} = tmpdir; + endif diff --git a/octave.spec b/octave.spec index 9ed4968..56581c8 100644 --- a/octave.spec +++ b/octave.spec @@ -3,13 +3,14 @@ Name: octave Version: 2.9.14 -Release: 1%{?dist} +Release: 2%{?dist} Summary: A high-level language for numerical computations Epoch: 6 Group: Applications/Engineering License: GPLv2+ Source: ftp://ftp.octave.org/pub/octave/bleeding-edge/octave-%{version}.tar.bz2 +Patch0: octave-2.9.14-pkg.patch URL: http://www.octave.org Requires: gnuplot less info texinfo Requires(post): /sbin/install-info @@ -53,6 +54,7 @@ applications which use GNU Octave. %prep %setup -q +%patch -p1 -b .pkg # Check that octave_api is set correctly if ! grep -q '^#define OCTAVE_API_VERSION "%{octave_api}"' src/version.h then @@ -96,6 +98,7 @@ desktop-file-install --vendor fedora --add-category X-Fedora --remove-category D HOST_TYPE=`$RPM_BUILD_ROOT%{_bindir}/octave-config -p CANONICAL_HOST_TYPE` mkdir -p $RPM_BUILD_ROOT%{_libexecdir}/%{name}/site/oct/%{octave_api}/$HOST_TYPE mkdir -p $RPM_BUILD_ROOT%{_libexecdir}/%{name}/site/oct/$HOST_TYPE +mkdir -p $RPM_BUILD_ROOT%{_datadir}/%{name}/packages %clean @@ -123,6 +126,7 @@ fi %config(noreplace) /etc/ld.so.conf.d/* %{_libdir}/octave* %{_datadir}/octave +%ghost %{_datadir}/octave/octave_packages %{_libexecdir}/octave %{_mandir}/man*/octave* %{_infodir}/octave.info* @@ -137,6 +141,11 @@ fi %changelog +* Tue Sep 25 2007 Orion Poplawski 2.9.14-2 +- Add /usr/share/octave/packages for add on packages and %%ghost + /usr/share/octave/packages/octave_packages +- Add patch for octave package manager that will be going upstream + * Tue Sep 18 2007 Quentin Spencer 2.9.14-1 - New release. - Remove redundant menu category in desktop file (bug 274431).