diff options
-rwxr-xr-x | Build/source/texk/texlive/linked_scripts/mkjobtexmf.pl | 10 | ||||
-rwxr-xr-x | Build/source/texk/texlive/linked_scripts/texdoc.tlu | 704 | ||||
-rwxr-xr-x | Build/source/texk/texlive/linked_scripts/tlmgr.pl | 250 |
3 files changed, 605 insertions, 359 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/mkjobtexmf.pl b/Build/source/texk/texlive/linked_scripts/mkjobtexmf.pl index cfbd60e4625..d9ce104e158 100755 --- a/Build/source/texk/texlive/linked_scripts/mkjobtexmf.pl +++ b/Build/source/texk/texlive/linked_scripts/mkjobtexmf.pl @@ -10,8 +10,8 @@ use strict; $^W=1; my $prj = 'mkjobtexmf'; -my $version = '0.6'; -my $date = '2008/04/05'; +my $version = '0.7'; +my $date = '2008/06/28'; my $author = 'Heiko Oberdiek'; my $copyright = "Copyright 2007, 2008 $author"; @@ -87,6 +87,7 @@ GetOptions( 'cmd-tex=s' => \$cmd_tex, 'cmd-kpsewhich=s' => \$cmd_kpsewhich, 'cmd-texhash=s' => \$cmd_texhash, + 'cmd-strace=s' => \$cmd_strace, 'strace' => \$strace, 'copy' => \$copy, 'flat' => \$flat, @@ -799,6 +800,11 @@ modify it under the same terms as Perl itself * Tiny fix in target `uninstall' in file `Makefile.in'. (Thanks to Karl Berry) +=item 2008/06/28 v0.7 + +* Fix for unknown option `--cmd-strace'. + (Thanks to Juho Niemel"a) + =back =cut diff --git a/Build/source/texk/texlive/linked_scripts/texdoc.tlu b/Build/source/texk/texlive/linked_scripts/texdoc.tlu index a8d6adf1751..f6bf05507de 100755 --- a/Build/source/texk/texlive/linked_scripts/texdoc.tlu +++ b/Build/source/texk/texlive/linked_scripts/texdoc.tlu @@ -1,5 +1,5 @@ #!/usr/bin/env texlua --- $Id: texdoc.tlu 8423 2008-05-31 00:37:02Z mpg $ +-- $Id: texdoc.tlu 9448 2008-07-11 12:55:06Z mpg $ --[[ Written in lua by Frank Küster (2007) based on the shell script by Thomas Esser, David Aspinall, and Simon Wilkinson. Public domain.]] @@ -18,38 +18,57 @@ Public domain.]] - initial public release ]] -progname = 'texdoc'; -version = '0.3'; -usage = ' Usage: ' .. progname ..' [-h|--help] name\ - -h|--help\t\t Show this help\ - -V|--version\t\t Print the version of the program\ - -v|--verbose\t\t Show the command being used to display the documentation\ - -l|--list\t\t List matching files, do not start a viewer.\ - -s|--search\t\t search for name as a pattern'; +progname = 'texdoc' +version = '0.31' +usage_msg = [[ +Usage: texdoc -h, --help | -v, --version | [option] name + -h|--help Show this help. + -V|--version Print the version of the program. + -v|--verbose Show the command being used to display the documentation. + -l|--list List matching files, do not start a viewer. + -s|--search Search for name as a pattern.]] +notfound_msg = [[ +Sorry, I'm not smart enough to find documentation for PKGNAME. Please see +http://tug.org/pkginfo/PKGNAME for information about the package.]] +-- [[ for our eyes only ]] +opt_debug = false +-- print debugging messages to stderr +function print_debug (message) + if opt_debug then + io.stderr:write(arg[0]..': '..message..'\n') + end +end +-- must have at least one arg if not arg[1] then - print (usage); - return + print (usage_msg) + return end -mode = 'view'; -verbose = false; +-- reading and setting options +mode = 'view' +verbose = false while table.maxn(arg) > 0 and string.match(arg[1],'^%-') do - curr_arg = table.remove(arg,1) - if string.match (curr_arg,'-h') or string.match (curr_arg,'--help') then - print (usage); - os.exit(0); - elseif string.match (curr_arg,'-V') or string.match (curr_arg,'--version') then - print (progname .. ' version: ' .. version ); - os.exit(0); - elseif string.match (curr_arg,'-v') or string.match (curr_arg,'--verbose') then - verbose = true; - elseif string.match (curr_arg,'-l') or string.match (curr_arg,'--list' ) then - mode = 'list'; - elseif string.match (curr_arg,'-s') or string.match (curr_arg,'--search' ) then - mode = 'search'; - end + curr_arg = table.remove(arg,1) + if string.match (curr_arg,'-h') + or string.match (curr_arg,'--help') then + print (usage_msg) + os.exit(0) + elseif string.match (curr_arg,'-V') + or string.match (curr_arg,'--version') then + print (progname .. ' version: ' .. version ) + os.exit(0) + elseif string.match (curr_arg,'-v') + or string.match (curr_arg,'--verbose') then + verbose = true + elseif string.match (curr_arg,'-l') + or string.match (curr_arg,'--list') then + mode = 'list' + elseif string.match (curr_arg,'-s') + or string.match (curr_arg,'--search') then + mode = 'search' + end end --[[ aliases ]] @@ -66,103 +85,101 @@ end --[[ function definitions ]] function list_iter (t) - local i = 0 - local n = table.getn(t) - return function () - i = i + 1 - if i <= n then return t[i] end - end + local i = 0 + local n = table.getn(t) + return function () + i = i + 1 + if i <= n then return t[i] end + end end -- [[ functions for the search option ]] -no_lsr_doctrees = {}; +no_lsr_doctrees = {} function get_lsr_files () - local lsr_files = {}; - local pathlist = kpse.expand_braces('$TEXDOCS'); - for path in string.gmatch(pathlist, "[^:;]+") do - path = string.gsub(path,'//$','') - local tree_root - tree_root = string.gsub(path,'doc$','') - tree_root = string.gsub(tree_root,'^!!','') - if lfs.isfile(tree_root .. "ls-R") then - table.insert(lsr_files,tree_root .. "ls-R") - else - if not string.match(path,'^%.$') and lfs.isdir(path) then - table.insert(no_lsr_doctrees,path) - end - end -- does lsRfile exist? - end -- for path - local i = 0 - local n = table.getn(lsr_files) - -- TODO: We completely ignore trees without ls-R files. Since I - -- don't know how to get the output of "find" without resorting to - -- temporary files, anyway, I don't care. - return function () - i = i +1 - if i <= n then return lsr_files[i] end - end - + local lsr_files = {} + local pathlist = kpse.expand_braces('$TEXDOCS') + for path in string.gmatch(pathlist, "[^:;]+") do + path = string.gsub(path,'//$','') + local tree_root + tree_root = string.gsub(path,'doc$','') + tree_root = string.gsub(tree_root,'^!!','') + if lfs.isfile(tree_root .. "ls-R") then + table.insert(lsr_files,tree_root .. "ls-R") + else + if not string.match(path,'^%.$') and lfs.isdir(path) then + table.insert(no_lsr_doctrees,path) + end + end -- does lsRfile exist? + end -- for path + local i = 0 + local n = table.getn(lsr_files) + -- TODO: We completely ignore trees without ls-R files. Since I + -- don't know how to get the output of "find" without resorting to + -- temporary files, anyway, I don't care. + return function () + i = i +1 + if i <= n then return lsr_files[i] end + end end -- get_lsr_files() function deluaficate(oldpat) - local newpat - -- better use long strings here, no escaping of \ needed there. - newpat = string.gsub(oldpat,'([^\\])%-','%1%%%-') - newpat = string.gsub(newpat,'\\','') - return newpat + local newpat + -- better use long strings here, no escaping of \ needed there. + newpat = string.gsub(oldpat,'([^\\])%-','%1%%%-') + newpat = string.gsub(newpat,'\\','') + return newpat end --deluaficate docdirs = {} docfiles = {} function pattern_search (pattern) - pattern = deluaficate(pattern) - -- populate docdirs and doclines list - for database in get_lsr_files() do - local texmf_tree = string.gsub(database,'ls%-R$','') - is_docline = false - local this_dir -- changed to each individual docdir - for line in io.lines(database) do - if string.match(line,'^./') then - -- a directory - this_dir = string.gsub(line,'^./',texmf_tree) - this_dir = string.gsub(this_dir,':$','/') - if string.match(line,'^./doc') then - -- the next file lines are in docdir "this_dir" - is_docline = true - -- save it in the docdirs table - table.insert(docdirs,this_dir) - else - is_docline = false - end -- docdir - elseif string.match(line,'^%s*$') then - -- empty line, do nothing - -- now we have only file lines left, are they a docline? - elseif is_docline then - local fullpath = this_dir .. line --- print(fullpath) - table.insert(docfiles,fullpath) - end -- line starting with ./ - end -- for line - end -- for database - for no_lsr_dir in list_iter(no_lsr_doctrees) do - recurse_tree(no_lsr_dir) - end - - print("Directories that match:") - for dir in list_iter(docdirs) do - if string.match(dir,pattern) then - print (dir) - end - end -- for dir - print() - print("Files that match:") - for file in list_iter(docfiles) do - if string.match(file,pattern) then - print (file) - end - end -- for file - + pattern = deluaficate(pattern) + -- populate docdirs and doclines list + for database in get_lsr_files() do + local texmf_tree = string.gsub(database,'ls%-R$','') + is_docline = false + local this_dir -- changed to each individual docdir + for line in io.lines(database) do + if string.match(line,'^./') then + -- a directory + this_dir = string.gsub(line,'^./',texmf_tree) + this_dir = string.gsub(this_dir,':$','/') + if string.match(line,'^./doc') then + -- the next file lines are in docdir "this_dir" + is_docline = true + -- save it in the docdirs table + table.insert(docdirs,this_dir) + else + is_docline = false + end -- docdir + elseif string.match(line,'^%s*$') then + -- empty line, do nothing + -- now we have only file lines left, are they a docline? + elseif is_docline then + local fullpath = this_dir .. line + -- print(fullpath) + table.insert(docfiles,fullpath) + end -- line starting with ./ + end -- for line + end -- for database + for no_lsr_dir in list_iter(no_lsr_doctrees) do + recurse_tree(no_lsr_dir) + end + -- + print("Directories that match:") + for dir in list_iter(docdirs) do + if string.match(dir,pattern) then + print (dir) + end + end -- for dir + print() + print("Files that match:") + for file in list_iter(docfiles) do + if string.match(file,pattern) then + print (file) + end + end -- for file end -- function pattern_search() function recurse_tree (path) @@ -170,188 +187,313 @@ function recurse_tree (path) if file ~= "." and file ~= ".." then local f = path..'/'..file local attr = lfs.attributes (f) - if attr then -- else stale symlink - if attr.mode == "directory" then - table.insert(docdirs,f) - recurse_tree (f) - else - table.insert(docfiles,f) - end + if attr then -- else stale symlink + if attr.mode == "directory" then + table.insert(docdirs,f) + recurse_tree (f) + else + table.insert(docfiles,f) + end end end end - end --function recurse_tree - - ---[[ functions for parsing texmf.cnf ]] -function set_var_from_texmf(oldvalue,texmfvar) - local newvalue - newvalue = kpse.var_value(texmfvar) - if newvalue then - return newvalue - else - return oldvalue - end +end --function recurse_tree + + +-- [[ set values from config files or defaults ]] + +config = {} -- everything is stored in this table +-- newer values don't override older ones +function set_config_element (key, value) + if config[key] == nil then + config[key] = value + end +end +-- set a whole list +function set_config_list (conf) + for key, value in pairs(conf) do + set_config_element (key, value) + end end -function set_listvar_from_texmf(oldvalue,texmfvar) - local list_as_string - local templist = {} - list_as_string = set_var_from_texmf('',texmfvar) - for element in string.gmatch(list_as_string,'[^,;:]+') do - table.insert(templist,element) - end - if table.maxn(templist) > 0 then - return templist - else - return oldvalue - end -end -- set_listvar_from_texmf - -function set_listvar_from_expand_braces(oldvalue,texmfvar) - local list_as_string - local templist = {} - list_as_string = kpse.expand_braces(texmfvar) - for element in string.gmatch(list_as_string,'[^,;:]*:') do - element = string.gsub(element,':','') - table.insert(templist,element) - end - if table.maxn(templist) > 0 then - return templist - else - return oldvalue - end -end -- set_listvar_from_expand_braces - ---[[ initialize kpathsea ]] -kpse.set_program_name("texdoc") - --- [[ initialize some variables ]] -texdoc_formats = {'dvi','pdf','ps','txt','html'} - --- can be done with: if (os.type == "windows") then -if string.find(os.getenv("PATH"),";") then - -- probably Windows (or OS/2) - -- which commands should we use for unzipping? - texdoc_unzip = { - gz = "gzip -d -c ", - bz2 = "bzip2 -d -c " - }; - texdoc_viewer = { - dvi = '(start /wait %s ) &', - html = '(start /wait %s) &', - pdf = '(start /wait %s) &', - ps = '(start /wait %s) &', - txt = '(start /wait %s) &', - tex = '(start /wait %s) &' - }; - rmfile_command = 'del /F '; - rmdir_command = 'rmdir '; -else - -- probably UNIX-like - texdoc_unzip = { - gz = "gzip -d -c ", - bz2 = "bzip2 -d -c " - }; - texdoc_viewer = { - dvi = '(xdvi %s ) &', - html = '(see %s) &', - pdf = '(xpdf %s) &', - ps = '(gv %s) &', - txt = '(less %s )', - tex = '(less %s )' - }; - rmfile_command = 'rm -f '; - rmdir_command = 'rmdir '; + +-- initialize kpathsea +kpse.set_program_name(arg[-1], "texdoc") + +-- read a particular config file if it exists. Used by setup_config() only. +function read_config_file(configfile) + if (lfs.isfile(configfile)) then -- configfile exists + local cnf=assert(io.open(configfile, 'r')) + while true do + local key, val + local line=cnf:read('*line') + if line == nil then break end -- EOF + line=string.gsub(line, '%s*#.*$', '') -- comments begin with #. + line=string.gsub(line, '%s*$', '') -- remove trailing spaces. + if (string.match(line, '[%a_]+%s*=%s*.+')) then + key, val=string.match(line, '([%a_]+)%s*=%s*(.+)') + set_config_element(key, val) + else + if (not string.match (line, '^%s*$')) then + debug (configfile..': Syntax error: '..line) + end + end + end + cnf:close() + else + debug ('config file "'..configfile..'" not found') + end end -texdoc_zipformats = {'','gz','bz2'}; -texdoc_formats = {'','dvi','html','pdf','ps','txt','tex'}; -extlist = {'','.dvi', '.dvi.gz', '.dvi.bz2', '.pdf', '.pdf.gz', '.pdf.bz2', '.ps', '.ps.gz', '.ps.bz2', '.txt', '.txt.gz', '.txt.bz2', '.html'}; - --- [[ override hardcoded variables with values from texmf.cnf ]] -rmfile_command = set_var_from_texmf(rmfile_command,'TEXDOC_RMFILE') -rmdir_command = set_var_from_texmf(rmdir_command,'TEXDOC_RMDIR') -texdoc_formats = set_listvar_from_texmf(texdoc_formats,'TEXDOC_FORMATS') -for format in list_iter(texdoc_formats) do - viewer_var = 'TEXDOC_VIEWER_' .. string.upper(format) - texdoc_viewer[format] = set_var_from_texmf(texdoc_viewer[format],viewer_var) +-- read all config files. +function setup_config () + local TEXMFHOME, TEXMFLOCAL + local platform, configfile, configfiles + local ext, command, default_viewer + + platform=string.match(kpse.var_value('SELFAUTOLOC'), '.*/(.*)$') + TEXMFHOME=kpse.var_value('TEXMFHOME') + TEXMFLOCAL=kpse.var_value('TEXMFLOCAL') + + -- the following config files are read if they exist. + configfiles={ + TEXMFHOME ..'/texdoc/texdoc-'..platform..'.cnf', + TEXMFHOME ..'/texdoc/texdoc.cnf', + TEXMFLOCAL..'/texdoc/texdoc-'..platform..'.cnf', + TEXMFLOCAL..'/texdoc/texdoc.cnf' + } + + for i, configfile in ipairs(configfiles) do -- process all config files + debug ('processing "'..configfile..'"') + read_config_file(configfile) + end end -texdoc_zipformats = set_listvar_from_texmf(texdoc_zipformats,'TEXDOC_ZIPFORMATS') -for zipext in list_iter(texdoc_zipformats) do - viewer_var = 'TEXDOC_UNZIP_' .. string.upper(zipext) - texdoc_unzip[zipext] = set_var_from_texmf(texdoc_unzip[zipext],viewer_var) + +function get_viewer_from_env (variable) + local viewer = os.getenv(variable) + if viewer then + return "("..viewer.." %s)" + else + return nil + end end -extlist = set_listvar_from_expand_braces(extlist,'$TEXDOCEXT'); + +-- with intermediate priority, we shall make use of some environment variables +set_config_list { + viewer_html = get_viewer_from_env ("BROWSER"), + viewer_tex = get_viewer_from_env ("PAGER"), + viewer_txt = get_viewer_from_env ("PAGER") +} + +-- for default viewer on general Unix, we use a list +-- and check in the path in order to find a suitable program + +-- check if "name" is the name of a file in the path +-- Warning: to be used only on Unix (hard-coded separators) +function is_in_path(name) + local path_list = string.explode(os.getenv("PATH"), ':') + for _, path in ipairs(path_list) do + if lfs.isfile(path..'/'..name) then return true end + end + return false +end + +-- return the first element of "list" whos name is found in path, or nil +function first_in_path(list) + for _, cmd in ipairs(list) do + if is_in_path(cmd[1]) then return cmd[2] end + end + return nil +end + +-- some fall-back default values +if (os.type == "windows") then + -- probably Windows (or OS/2) + -- which commands should we use for unzipping? + set_config_list { + unzip_gz = "gzip -d -c ", + unzip_bz2 = "bzip2 -d -c ", + rm_file = 'del /F ', + rm_dir = 'rmdir ', + viewer_dvi = '(start /wait %s) &', + viewer_html = '(start /wait %s) &', + viewer_pdf = '(start /wait %s) &', + viewer_ps = '(start /wait %s) &', + viewer_txt = '(start /wait %s) &', + viewer_tex = '(start /wait %s) &' + } +else -- since we don't support msdos, if os.type is not windows, it's unix + set_config_list { + unzip_gz = "gzip -d -c ", + unzip_bz2 = "bzip2 -d -c ", + rm_file = 'rm -f ', + rm_dir = 'rmdir ' + } + if (os.name == 'macosx') then + set_config_list { + viewer_dvi = '(open %s)', + viewer_html = '(open %s)', + viewer_pdf = '(open %s)', + viewer_ps = '(open %s)', + viewer_txt = '(less %s)', + viewer_tex = '(less %s)' + } + else + set_config_list { + viewer_dvi = first_in_path { + {'see', '(see %s) &'}, + {'evince', '(evince %s) &'}, + {'okular', '(okular %s) &'}, + {'kdvi', '(kdvi %s) &'}, + {'xdvi', '(xdvi %s) &'} + }, + viewer_html = first_in_path { + {'see', '(see %s) &'}, + {'firefox', '(firefox %s) &'}, + {'mozilla', '(mozilla %s) &'}, + {'konqueror', '(konqueror %s) &'}, + {'epiphany', '(epiphany %s) &'}, + {'opera', '(opera %s) &'}, + {'w3m', '(w3m %s) &'}, + {'links', '(links %s) &'}, + {'lynx', '(lynx %s) &'} + }, + viewer_pdf = first_in_path { + {'see', '(see %s) &'}, + {'evince', '(evince %s) &'}, + {'okular', '(okular %s) &'}, + {'kpdf', '(kpdf %s) &'}, + {'xpdf', '(xpdf %s) &'} + }, + viewer_ps = first_in_path { + {'see', '(see %s) &'}, + {'evince', '(evince %s) &'}, + {'okular', '(okular %s) &'}, + {'kghostview', '(kghostview %s) &'}, + {'gv', '(gv %s) &'} + }, + viewer_txt = first_in_path { + {'most', '(most %s)'}, + {'less', '(less %s)'}, + {'more', '(more %s)'} + }, + viewer_tex = first_in_path { + {'most', '(most %s)'}, + {'less', '(less %s)'}, + {'more', '(more %s)'} + } + } + end +end + +-- now a particular case for config.extlist +set_config_element('extlist', { + '','.pdf', '.pdf.gz', '.pdf.bz2', '.dvi', '.dvi.gz', '.dvi.bz2', + '.ps', '.ps.gz', '.ps.bz2', '.txt', '.txt.gz', '.txt.bz2', '.html' +}) + -- we want an empty string for ext at the beginning, so that it works -- to specify the complete filename. Doesn't matter when there's one -- more empty string, but we can easily avoid two in a row -if not extlist[1] == '' then - insert(extlist,1,'') +if not config.extlist[1] == '' then + insert(config.extlist,1,'') end +-- [[ functions for viewing ]] +-- uncompress if needed +function unzip_if_needed (ext) + zipext = string.match(ext,'%..*%.(.*)') + if zipext then + unzip_command = config['unzip_'..zipext] + viewext = string.match(ext,'%.(.*)%..*$') + basebame_pattern = '.*/(.*%.' .. viewext .. ')' + basename = string.match(filename,basebame_pattern) + -- uncompress only once per file, in case it is given + -- more than once (dvi besides ps or so) + -- TODO: to be done + tmpdir = os.tmpdir("/tmp/texdoc.XXXXXX") + unzip_commandline = unzip_command .. filename .. " > " + .. tmpdir .. "/" .. basename + if os.execute(unzip_commandline) then + filename = tmpdir .. "/" .. basename + else + print("Error executing \n" .. unzip_commandline) + end + viewer_replacement = filename .. ';' .. config.rm_file + .. filename .. ';' .. config.rm_dir .. tmpdir + else + if ext == '' then + -- fallback if complete filename has been specified + ext = string.match(filename,'.*(%..*)$') + if not ext then + -- still no extension for filenames like README + ext = 'txt' + end + end + viewer_replacement = filename + viewext = string.match(ext,'%.(.*)$') + if not viewext or not config['viewer_'..viewext] then + -- complete filename specified, unknown extension, use "txt" + viewext = 'txt' + end + end -- zipped or not +end + +-- view a file, if possible +function try_viewing () + if config['viewer_'..viewext] == nil then + print ("Sorry, no "..viewext.."viewer found. You can choose one\n".. + "with the viewer_"..viewext" variable in texdoc.cnf.\n".. + "Please report the problem so we can add your viewer as a default.\n") + else + view_command = string.gsub( + config['viewer_'..viewext], '%%s',viewer_replacement) + if verbose then + print(view_command) + end + view_result = os.execute(view_command) + if view_result then + return true + else + print("Error executing \n" .. view_command) + end + end + return false +end + +-- [[ the main loop ]] for docname in list_iter (arg) do - if string.match(mode,'search') then - pattern_search(docname); - elseif string.match(mode,'view') or string.match(mode,'list') then - for ext in list_iter(extlist) do - filename = kpse.find_file(docname .. ext , "TeX system documentation") - - if filename then - if string.match (mode, 'list') then - print(filename); - else - -- mode is view, is unzipping needed? - zipext = string.match(ext,'%..*%.(.*)'); - if zipext then - unzip_command = texdoc_unzip[zipext]; - viewext = string.match(ext,'%.(.*)%..*$'); - basebame_pattern = '.*/(.*%.' .. viewext .. ')'; - basename = string.match(filename,basebame_pattern); - - -- uncompress only once per file, in case it is given more - -- than once (dvi besides ps or so) - -- TODO: to be done - - tmpdir = os.tmpdir("/tmp/texdoc.XXXXXX"); - - unzip_commandline = unzip_command .. filename .. " > " .. tmpdir .. "/" .. basename; - if os.execute(unzip_commandline) then - filename = tmpdir .. "/" .. basename; - else - print("Error executing \n" .. unzip_commandline); - end - viewer_replacement = filename .. ';' .. rmfile_command .. filename .. ';' .. rmdir_command .. tmpdir; - else - if ext == '' then - -- fallback if complete filename has been specified - ext = string.match(filename,'.*(%..*)$') - if not ext then - -- still no extension for filenames like README - ext = 'txt'; - end - end - viewer_replacement = filename; - viewext = string.match(ext,'%.(.*)$'); - if not viewext or not texdoc_viewer[viewext] then - -- complete filename specified, unknown extension, use "txt" - viewext = 'txt' - end - end -- zipped or not - view_command = string.gsub(texdoc_viewer[viewext],'%%s',viewer_replacement) - if verbose then - print(view_command); - end - view_result = os.execute(view_command); - if view_result then - do break end; - else - print("Error executing \n" .. view_command); - end - end -- list or view - end -- found a filename with that extension or not? - end -- for ext - end -- if construct "case mode in" -end -- for docname - --- cleanup_tmpdir(); + local docfound = false + if string.match(mode,'search') then + docfound = true + pattern_search(docname) + elseif string.match(mode,'view') or string.match(mode,'list') then + for ext in list_iter(config.extlist) do + filename = kpse.find_file(docname .. ext, + "TeX system documentation") + if filename then + docfound = true + if string.match (mode, 'list') then + print(filename) + else -- mode is view, is unzipping needed? + unzip_if_needed(ext) + local ok = try_viewing() + if ok then break end + end -- list or view + end -- found a filename with that extension or not? + end -- for ext + end -- if construct "case mode in" + if not docfound then -- apologize if we didn't suceed + msg = string.gsub(notfound_msg, 'PKGNAME', docname) + print (msg) -- to get rid of gsub's 2nd value + end +end -- for docname in arg + +-- cleanup_tmpdir() + +-- Local Variables: +-- lua-indent-level: 4 +-- tab-width: 4 +-- indent-tabs-mode: nil +-- End: +-- vim: sw=4 ts=4 expandtab: diff --git a/Build/source/texk/texlive/linked_scripts/tlmgr.pl b/Build/source/texk/texlive/linked_scripts/tlmgr.pl index f2a8d32c689..23911b824bc 100755 --- a/Build/source/texk/texlive/linked_scripts/tlmgr.pl +++ b/Build/source/texk/texlive/linked_scripts/tlmgr.pl @@ -1,5 +1,5 @@ #!/usr/bin/env perl -# $Id: tlmgr.pl 8708 2008-06-13 11:56:01Z preining $ +# $Id: tlmgr.pl 9427 2008-07-10 10:27:48Z preining $ # # Copyright 2008 Norbert Preining # This file is licensed under the GNU General Public License version 2 @@ -10,7 +10,7 @@ # - (?) removal does not remove created format files from TEXMFSYSVAR # - other features: dependency check?, ...? -my $svnrev = '$Revision: 8708 $'; +my $svnrev = '$Revision: 9427 $'; $svnrev =~ m/: ([0-9]+) /; my $tlmgrrevision = $1; @@ -30,7 +30,7 @@ use TeXLive::TLMedia; use TeXLive::TLUtils; use TeXLive::TLWinGoo; use TeXLive::TLPostActions; -TeXLive::TLUtils->import( qw(kpsewhich member win32 merge_into) ); +TeXLive::TLUtils->import( qw(kpsewhich member win32 merge_into copy log) ); use Cwd qw/abs_path/; use Pod::Usage; use Getopt::Long qw(:config no_autoabbrev require_order); @@ -52,16 +52,11 @@ my $location; my $opt_location; my $opt_help = 0; my $opt_version = 0; -my $opt_netarchive; -my $opt_diskarchive; my $opt_gui = 0; my $opt_gui_lang; TeXLive::TLUtils::process_logging_options(); - GetOptions("location=s" => \$opt_location, - "netarchive=s" => \$opt_netarchive, - "diskarchive=s" => \$opt_diskarchive, "gui" => \$opt_gui, "gui-lang=s" => \$opt_gui_lang, "version" => \$opt_version, @@ -75,31 +70,35 @@ if (!defined($action) && $opt_gui) { if ($opt_version) { print "tlmgr revision $tlmgrrevision\n"; - exit(0); -} - -if (!defined($action) && !$opt_help) { - print "missing action\ntry 'tlmgr help' for more information.\n"; - exit 1; + exit 0; } if (defined($action) && ($action =~ m/^help/i)) { $opt_help = 1; } -$NetArchive = $opt_netarchive if (defined($opt_netarchive)); -$DiskArchive = $opt_diskarchive if (defined($opt_diskarchive)); +if (!defined($action) && !$opt_help) { + die "$0: missing action; try --help if you need it.\n"; +} -if ($^O=~/^MSWin(32|64)$/i) { +if ($^O =~ /^MSWin(32|64)$/i) { pod2usage(-exitstatus => 0, -verbose => 2, -noperldoc => 1) if $opt_help; } else { pod2usage(-exitstatus => 0, -verbose => 2) if $opt_help; } -my $loadmediasrcerror = "Cannot load TeX Live Database from "; +my $loadmediasrcerror = "Cannot load TeX Live database from "; my %ret; -if ($action =~ m/^generate$/i) { +if ($action =~ m/^_include_tlpobj$/) { + # this is an internal function that should not be used outside + init_local_db(); + my $tlpobj = TeXLive::TLPOBJ->new; + $tlpobj->from_file($ARGV[0]); + $localtlpdb->add_tlpobj($tlpobj); + $localtlpdb->save; + exit(0); +} elsif ($action =~ m/^generate$/i) { merge_into(\%ret, action_generate()); } elsif ($action =~ m/^gui$/i) { action_gui(); @@ -131,7 +130,7 @@ if ($action =~ m/^generate$/i) { merge_into(\%ret, action_remove()); } elsif (($action eq "paper") || ($action eq "dvips") || ($action eq "xdvi") || ($action eq "pdftex") || ($action eq "dvipdfm") || - ($action eq "dvipdfmx")) { + ($action eq "dvipdfmx") || ($action eq "context")) { if ($opt_gui) { action_gui("config"); } @@ -181,18 +180,26 @@ if (defined($ret{'format'})) { } if (defined($ret{'language'})) { print "regenerating language.dat\n"; - TeXLive::TLUtils::create_language($localtlpdb, + TeXLive::TLUtils::create_language_dat($localtlpdb, "$TEXMFSYSVAR/tex/generic/config/language.dat", "$TEXMFLOCAL/tex/generic/config/language-local.dat"); + print "regenerating language.def\n"; + TeXLive::TLUtils::create_language_def($localtlpdb, + "$TEXMFSYSVAR/tex/generic/config/language.def", + "$TEXMFLOCAL/tex/generic/config/language-local.def"); # system("texconfig-sys", "generate", "language"); # # win32 fmtutil needs language.dat WITHOUT full specification if (TeXLive::TLUtils::win32()) { print "running fmtutil-sys --byhyphen language.dat\n"; system("fmtutil-sys", "--byhyphen", "language.dat"); + print "running fmtutil-sys --byhyphen language.def\n"; + system("fmtutil-sys", "--byhyphen", "language.def"); } else { print "running fmtutil-sys --byhyphen $TEXMFSYSVAR/tex/generic/config/language.dat\n"; system("fmtutil-sys", "--byhyphen", "$TEXMFSYSVAR/tex/generic/config/language.dat"); + print "running fmtutil-sys --byhyphen $TEXMFSYSVAR/tex/generic/config/language.def\n"; + system("fmtutil-sys", "--byhyphen", "$TEXMFSYSVAR/tex/generic/config/language.def"); } } @@ -217,8 +224,8 @@ sub remove_package { return; } } - if ($pkg eq "texlive.infra") { - log("Not removing texlive.infra, it is essential!\n"); + if ($pkg =~ m/^texlive\.infra/) { + log("Not removing $pkg, it is essential!\n"); return; } print "remove: $pkg\n"; @@ -595,14 +602,9 @@ sub action_update { if (!@todo) { printf "tlmgr update takes either a list of packages or --all\n"; } + my $updater_started = 0; foreach my $pkg (@todo) { next if ($pkg =~ m/^00texlive/); - # it looks like that can actually be done!!! - # It gives several warnings but afterwards the files are changed. Strange - #if (win32() && (($pkg eq "texlive.infra") || ($pkg eq "bin-texlive"))) { - # info("We cannot upgrade $pkg on win32, since we are running it!\n"); - # next; - #} my $tlp = $localtlpdb->get_package($pkg); if (!defined($tlp)) { printf STDERR "Strange, $pkg cannot be found!\n"; @@ -634,16 +636,77 @@ sub action_update { $opt_backupdir, "${pkg}.r" . $tlp->revision); } } - print "update: $pkg (first remove old, then install new)\n"; - merge_into(\%ret, &remove_package($pkg, $localtlpdb, 1)); - merge_into(\%ret, $tlmediasrc->install_package($pkg, $localtlpdb, $opt_nodepends, 0)); - print "update: $pkg done\n"; + if (win32() && ($pkg =~ m/$WinSpecialUpdatePackagesRegexp/)) { + if (!$updater_started) { + open UPDATER, ">" . $localtlpdb->root . "/tlpkg/installer/updater.bat" + or die "Cannot create updater.bat: $!"; + print UPDATER <<'EOF'; +rem update program, can savely removed after it has been done +set tlupdate=%~dp0 +set tldrive=%~d0 + +%tldrive% +cd %tlupdate% +rem now we are in .../tlpkg/installer +rem create tar.exe backup +copy tar.exe tarsave.exe +cd .. +cd .. +rem now we are in the root + +EOF +; + $updater_started = 1; + } + # these packages cannot be upgrade on win32 + # so we have to create a update program + my $media = $tlmediasrc->media; + my $remoteroot = $mediatlpdb->root; + my $root = $localtlpdb->root; + my $temp = "$root/temp"; + TeXLive::TLUtils::mkdirhier($temp); + if ($media eq 'DVD') { + tlwarn ("Creating updater from DVD currently not implemented!\n"); + } else { + if ($media eq 'CD') { + copy("$remoteroot/$Archive/$pkg.tar.lzma", "$temp"); + } else { # net + TeXLive::TLUtils::download_file("$remoteroot/$Archive/$pkg.tar.lzma", "$temp/$pkg.tar.lzma"); + } + # now we should have the file present + if (! -r "$temp/$pkg.tar.lzma") { + tlwarn ("Couldn't get $pkg.tar.lzma, that is bad\n"); + } else { + # add lines to the un-archiver + print UPDATER <<EOF; +tlpkg\\installer\\lzma\\lzmadec.win32.exe < temp\\$pkg.tar.lzma > temp\\$pkg.tar +tlpkg\\installer\\tarsave.exe -x -f temp\\$pkg.tar +call tlmgr _include_tlpobj tlpkg\\tlpobj\\$pkg.tlpobj +rem for now disable the removal of the downloads, we could need it for testing +rem del temp\\$pkg.tar.lzma +EOF +; + } + } + } else { + print "update: $pkg (first remove old, then install new)\n"; + merge_into(\%ret, &remove_package($pkg, $localtlpdb, 1)); + merge_into(\%ret, $tlmediasrc->install_package($pkg, $localtlpdb, $opt_nodepends, 0)); + print "update: $pkg done\n"; + } } } elsif ($rev > $mediarev) { print "$pkg: revision in $location is less then local revision, not updating!\n"; next; } } + if ($updater_started) { + print UPDATER "del tlpkg\\installer\\tarsave.exe\n"; + print UPDATER "rem del /s /q temp\n"; + print UPDATER "rem rmdir temp\n"; + close (UPDATER); + tlwarn("UPDATER has been created, please execute tlpkg\\installer\\updater.bat\n"); + } return(\%ret); } @@ -851,26 +914,38 @@ sub action_generate { GetOptions("localcfg=s" => \$localconf, "dest=s" => \$dest,) or pod2usage(2); init_local_db(); - if ($what =~ m/^language$/i) { - $dest || ($dest = kpsewhich ("TEXMFSYSVAR") . "/tex/generic/config/language.dat"); - $localconf || ($localconf = kpsewhich ("TEXMFLOCAL") . "/tex/generic/config/language-local.dat"); - debug("$0: writing language data to $dest\n"); - TeXLive::TLUtils::create_language ($localtlpdb, $dest, $localconf); + my $TEXMFSYSVAR = kpsewhich("TEXMFSYSVAR"); + my $TEXMFLOCAL = kpsewhich("TEXMFLOCAL"); + + if ($what =~ m/^language(\.dat|\.def)?$/i) { + if ($what =~ m/^language(\.dat)?$/i) { + $dest ||= "$TEXMFSYSVAR/tex/generic/config/language.dat"; + $localconf ||= "$TEXMFLOCAL/tex/generic/config/language-local.dat"; + debug ("$0: writing language.dat data to $dest\n"); + TeXLive::TLUtils::create_language_dat($localtlpdb, $dest, $localconf); + $dest .= ".def"; + } + if ($what =~ m/^language(\.def)?$/i) { + $dest ||= "$TEXMFSYSVAR/tex/generic/config/language.def"; + $localconf ||= "$TEXMFLOCAL/tex/generic/config/language-local.def"; + debug("$0: writing language.def data to $dest\n"); + TeXLive::TLUtils::create_language_def($localtlpdb, $dest, $localconf); + } } elsif ($what =~ m/^fmtutil$/i) { - $dest || ($dest = kpsewhich("TEXMFSYSVAR") . "/web2c/fmtutil.cnf"); - $localconf || ($localconf = kpsewhich("TEXMFLOCAL") . "/web2c/fmtutil-local.cnf"); - debug("$0: writing fmtutil.cnf data to $dest\n"); + $dest ||= "$TEXMFSYSVAR/web2c/fmtutil.cnf"; + $localconf ||= "$TEXMFLOCAL/web2c/fmtutil-local.cnf"; + debug("$0: writing new fmtutil.cnf to $dest\n"); TeXLive::TLUtils::create_fmtutil($localtlpdb, $dest, $localconf); } elsif ($what =~ m/^updmap$/i) { - $dest || ($dest = kpsewhich("TEXMFSYSVAR") . "/web2c/updmap.cfg"); - $localconf || ($localconf = kpsewhich("TEXMFLOCAL") . "/web2c/updmap-local.cfg"); + $dest ||= "$TEXMFSYSVAR/web2c/updmap.cfg"; + $localconf ||= "$TEXMFLOCAL/web2c/updmap-local.cfg"; debug("$0: writing new updmap.cfg to $dest\n"); - TeXLive::TLUtils::create_updmap ($localtlpdb, $dest, $localconf); + TeXLive::TLUtils::create_updmap($localtlpdb, $dest, $localconf); } else { - die "$0: Unknown option for generate: $what (try --help if you need it)\n"; + die "$0: Unknown option for generate: $what; try --help if you need it.\n"; } return; @@ -914,11 +989,15 @@ sub action_gui { if (defined($opt_gui_lang)); push @cmdline, "--location", "$opt_location" if (defined($opt_location)); - push @cmdline, "--netarchive", "$opt_netarchive" - if (defined($opt_netarchive)); - push @cmdline, "--diskarchive", "$opt_diskarchive" - if (defined($opt_diskarchive)); + push @cmdline, "--logfile", "$::LOGFILENAME" + if (defined($::LOGFILE)); + push @cmdline, "-v" if ($::opt_verbosity > 0); + push @cmdline, "-v" if ($::opt_verbosity > 1); + push @cmdline, "-q" if ($::opt_quiet > 0); if (defined($screen)) { + if (($screen eq "install") || ($screen eq "update")) { + push @cmdline, "--load"; + } push @cmdline, "--screen", $screen; } exec $perlbin @cmdline; @@ -1136,12 +1215,12 @@ tlmgr - the TeX Live Manager =head1 SYNOPSIS -tlmgr [I<options>] I<action> [I<option>]... [I<operand>]... +tlmgr [I<option>]... I<action> [I<option>]... [I<operand>]... =head1 DESCRIPTION B<tlmgr> manages an existing TeX Live installation, both packages and -options. +configurations options. =head1 OPTIONS @@ -1171,21 +1250,12 @@ Normally the GUI tries to deduce your language from the environment you can select a different language by giving this option a two-letter language code. -=item B<--netarchive> I<dir> - -Overrides the default settings for netarchive. Should be used with care. - -=item B<--diskarchive> I<dir> - -Overrides the default settings for diskarchive. Should be used with care. - -=item B<--version> - -Echos the tlmgr.pl script's revision number and exits. - =back -The standard options B<--help/-h/-?> and B<--debug> are also accepted. +The standard options are also accepted: B<--help/-h/-?>, B<--version>, +B<-q> (no informational messages), B<-v> (debugging messages, can be +repeated). For more information about the latter, see the +TeXLive::TLUtils documentation. =head1 ACTIONS @@ -1355,7 +1425,7 @@ C<srcfiles> (install source files). =item B<paper letter> -=item B<[xdvi|dvips|pdftex|dvipdfm|dvipdfmx] paper [help|papersize]> +=item B<[xdvi|dvips|pdftex|dvipdfm|dvipdfmx|context] paper [help|papersize]> Configures the system wide paper settings, either for all programs in one go, or just for the specified program. @@ -1428,25 +1498,43 @@ Do not ask for confirmation, remove immediately. =item B<generate language> +=item B<generate language.dat> + +=item B<generate language.def> + =item B<generate fmtutil> =item B<generate updmap> -B<WARNING:> This action overwrites any user changes made in -the respective files, by regenerating them from scratch. +The I<generate> action overwrites any manual changes made in the +respective files: it recreates them from scratch. -This is especially questionable with updmap, because the result will be -to disable all maps which have been manually installed (via C<updmap-sys ---enable>), e.g., for proprietary or local fonts. Be sure that's what -you want to do. +For fmtutil and the language files, this is normal, and both the TeX +Live installer and C<tlmgr> routinely call I<generate> for them. -This action regenerates any of the three config files C<language.dat>, -C<fmtutil.cnf>, and C<updmap.cfg> from the information present in the -local TLPDB. If the files C<language-local.dat>, C<fmtutil-local.cnf>, -or C<updmap-local.cfg> are present under C<TEXMFLOCAL> in the respective +For updmap, however, neither the installer nor C<tlmgr> use I<generate>, +because the result would be to disable all maps which have been manually +installed via C<updmap-sys --enable>, e.g., for proprietary or local +fonts. Only the changes in the C<--localcfg> file mentioned below are +incorporated by I<generate>. + +On the other hand, if you only use the fonts and font packages within +TeX Live, there is nothing wrong with using I<generate updmap>. Indeed, +we use it to generate the C<updmap.cfg> file that is maintained in the +live source repository. + +In more detail: I<generate> remakes any of the four config files +C<language.dat>, C<language.def>, C<fmtutil.cnf>, and C<updmap.cfg> from +the information present in the local TLPDB. If the files +C<language-local.dat>, C<language-local.def>, C<fmtutil-local.cnf>, or +C<updmap-local.cfg> are present under C<TEXMFLOCAL> in the respective directories, their contents will be simply merged into the final files, with no error checking of any kind. +The form C<generate language> recreates both the C<language.dat> and the +C<language.def> files, while the forms with extension only recreates +the given file. + Options: =over 8 @@ -1454,7 +1542,11 @@ Options: =item B<--dest> I<output file> specifies the output file (defaults to the respective location in -C<TEXMFSYSVAR>). +C<TEXMFSYSVAR>). If B<--dest> is given to C<generate language>, its +value will be used for the C<language.dat> output, and C<.def> will be +appended to the value for the name of the C<language.def> output file. +(This is just to avoid overwriting; if you really want a specific name +for each output file, we recommend invoking C<tlmgr> twice.) =item B<--localcfg> I<local conf file> @@ -1463,6 +1555,12 @@ location in C<TEXMFSYSVAR>). =back +The respective locations are as follows: + C<tex/generic/config/language.dat> (and C<language-local.dat>) + C<tex/generic/config/language.def> (and C<language-local.def>) + C<web2c/fmtutil.cnf> (and C<fmtutil-local.cnf>) + C<web2c/updmap.cfg> (and C<updmap-local.cnf>) + =back |