From 95eb7ead780f7de930d678a7ba295b27fa6d587e Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 8 Jun 2009 14:57:10 +0000 Subject: rework execute action handling so that it actually works, hopefully that means that: - handle_ret_hash is renamed to handle_execute_actions - make_ret_hash_from_execute is gone and replaced by TLUtils::announce_execute_actions git-svn-id: svn://tug.org/texlive/trunk@13671 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf/scripts/texlive/tlmgr.pl | 242 ++++++++++++---------- Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl | 4 +- Master/tlpkg/TeXLive/TLMedia.pm | 13 +- Master/tlpkg/TeXLive/TLPOBJ.pm | 41 ---- Master/tlpkg/TeXLive/TLPaper.pm | 36 ++-- Master/tlpkg/TeXLive/TLUtils.pm | 50 +++++ 6 files changed, 206 insertions(+), 180 deletions(-) (limited to 'Master') diff --git a/Master/texmf/scripts/texlive/tlmgr.pl b/Master/texmf/scripts/texlive/tlmgr.pl index 0c21efda53b..9bde01ab219 100755 --- a/Master/texmf/scripts/texlive/tlmgr.pl +++ b/Master/texmf/scripts/texlive/tlmgr.pl @@ -69,7 +69,7 @@ use TeXLive::TLPOBJ; use TeXLive::TLUtils; use TeXLive::TLWinGoo; TeXLive::TLUtils->import(qw(member info give_ctan_mirror win32 dirname - mkdirhier merge_into copy log debug)); + mkdirhier copy log debug)); use TeXLive::TLPaper; @@ -295,7 +295,6 @@ execute_action($action, @ARGV); sub execute_action { my ($action, @argv) = @_; - my %ret; # we have to set @ARGV to the @argv since many of the action_* subs # use GetOption @@ -349,45 +348,45 @@ sub execute_action { print "$loc\n"; finish(0); } elsif ($action =~ m/^generate$/i) { - merge_into(\%ret, action_generate()); + action_generate(); } elsif ($action =~ m/^gui$/i) { action_gui(); } elsif ($action =~ m/^arch$/i) { - merge_into(\%ret, action_arch()); + action_arch(); } elsif ($action =~ m/^option$/i) { - merge_into(\%ret, action_option()); + action_option(); finish(0); } elsif ($action =~ m/^list$/i) { - merge_into(\%ret, action_list()); + action_list(); finish(0); } elsif ($action =~ m/^check$/i) { - merge_into(\%ret, action_check()); + action_check(); } elsif ($action =~ m/^install$/i) { - merge_into(\%ret, action_install()); + action_install(); } elsif ($action =~ m/^update$/i) { - merge_into(\%ret, action_update()); + action_update(); } elsif ($action =~ m/^backup$/i) { - merge_into(\%ret, action_backup()); + action_backup(); } elsif ($action =~ m/^restore$/i) { - merge_into(\%ret, action_restore()); + action_restore(); } elsif ($action =~ m/^symlinks$/i) { - merge_into(\%ret, action_symlinks()); + action_symlinks(); finish(0); } elsif ($action =~ m/^search$/i) { - merge_into(\%ret, action_search()); + action_search(); finish(0); } elsif ($action =~ m/^show$/i) { - merge_into(\%ret, action_show()); + action_show(); finish(0); } elsif ($action =~ m/^remove$/i) { - merge_into(\%ret, action_remove()); + action_remove(); } elsif ($action =~ /^paper$/) { - merge_into(\%ret, action_paper()); + action_paper(); } elsif ($action =~ m/^uninstall$/i) { - merge_into(\%ret, action_uninstall()); + action_uninstall(); finish(0); } elsif ($action =~ m/^recreate-tlpdb$/i) { - merge_into(\%ret, action_recreate_tlpdb()); + action_recreate_tlpdb(); finish(0); } else { die "$0: unknown action: $action; try --help if you need it.\n"; @@ -400,7 +399,7 @@ sub execute_action { } # run external programs. - my $error_count = &handle_ret_hash(%ret); + my $error_count = &handle_execute_actions(); # done, just in case there are 256 errors. finish($error_count ? 1 : 0); @@ -430,73 +429,127 @@ sub do_cmd_and_check { # If the "map" key is specified, the value may be a reference to a list # of map command strings to pass to updmap, e.g., "enable Map=ascii.map". # -sub handle_ret_hash { - my (%ret) = @_; +sub handle_execute_actions { + my $errors = 0; - if (exists $ret{'mktexlsr'}) { + if ($::files_changed) { $errors += do_cmd_and_check("mktexlsr"); } - if (exists $ret{'map'}) { - # We run updmap-sys instead of calling our create_updmap() function - # (as we do for formats and languages), because many users run - # updmap themselves (not using our local cfg feature), since that's - # been the documented way to add fonts for many years. If we called - # create_updmap, such user maps would be lost. - foreach my $m (@{$ret{'map'}}) { - $errors += do_cmd_and_check("updmap-sys --nomkmap --nohash --$m"); + # + # maps handling + # if enabled and disabled -> do nothing + # if only enabled -> enable it + # if only disabled -> disable it + { + my %do_enable; + my %do_disable; + my $run_full = 0; + for my $m (keys %{$::execute_actions{'enable'}{'maps'}}) { + $run_full = 1; + $do_enable{$m} = 1; + } + for my $m (keys %{$::execute_actions{'disable'}{'maps'}}) { + $run_full = 1; + if (defined($do_enable{$m})) { + # we are upgrading because it is disabled and enabled, so + # delete the entry in do_enable, it is already + delete $do_enable{$m}; + } else { + # not new installed, so simply removed + $do_disable{$m} = 1; + } } - $errors += do_cmd_and_check("updmap-sys"); # runs mktexlsr. + for my $m (keys %do_disable) { + $errors += do_cmd_and_check("updmap-sys --nomkmap --nohash --disable $m"); + } + for my $m (keys %do_enable) { + my $str = "updmap-sys --nomkmap --nohash --enable " . + $::execute_actions{'enable'}{'maps'}{$m} . "=$m"; + $errors += do_cmd_and_check($str); + } + $errors += do_cmd_and_check("updmap-sys") if $run_full; } + chomp(my $TEXMFSYSVAR = `kpsewhich -var-value=TEXMFSYSVAR`); chomp(my $TEXMFLOCAL = `kpsewhich -var-value=TEXMFLOCAL`); + # format means create missing formats (because a new one was added). # format-regenerate is used when the paper size changes. In that # case, if option_create_formats is set, we simply want to generate # all formats; if not, then we only want to refresh existing ones. # - my $opt_fmt = $localtlpdb->option_create_formats; - if (exists $ret{'format'}) { - info("regenerating fmtutil.cnf in $TEXMFSYSVAR\n"); - TeXLive::TLUtils::create_fmtutil($localtlpdb, - "$TEXMFSYSVAR/web2c/fmtutil.cnf", - "$TEXMFLOCAL/web2c/fmtutil-local.cnf"); - if ($opt_fmt && !$ret{'format-regenerate'}) { - $errors += do_cmd_and_check("fmtutil-sys --missing"); + { + my %do_enable; + my $do_full = 0; + for my $m (keys %{$::execute_actions{'enable'}{'formats'}}) { + $do_full = 1; + $do_enable{$m} = 1; + } + for my $m (keys %{$::execute_actions{'disable'}{'formats'}}) { + $do_full = 1; + } + my $opt_fmt = $localtlpdb->option_create_formats; + if ($do_full) { + info("regenerating fmtutil.cnf in $TEXMFSYSVAR\n"); + TeXLive::TLUtils::create_fmtutil($localtlpdb, + "$TEXMFSYSVAR/web2c/fmtutil.cnf", + "$TEXMFLOCAL/web2c/fmtutil-local.cnf"); + } + if ($opt_fmt && !$::regenerate_all_formats) { + for my $f (keys %do_enable) { + info ("(re)creating format dump $f\n"); + $errors += do_cmd_and_check("fmtutil-sys --byfmt $f"); + } } } - # - if (exists $ret{'format-regenerate'}) { - my $a = $opt_fmt ? "--all" : "--refresh"; - $errors += do_cmd_and_check("fmtutil-sys $a"); - } - if (exists $ret{'language'}) { - for my $ext ("dat", "def") { - my $lang = "language.$ext"; - info("regenerating $lang\n"); + # + # hyphenation patterns + # if something has changed do the whole stuff ... + { + my $do_something = 0; + for my $m (keys %{$::execute_actions{'enable'}{'hyphens'}}) { + $do_something = 1; + last; + } + for my $m (keys %{$::execute_actions{'disable'}{'hyphens'}}) { + $do_something = 1; + last; + } + + if ($do_something) { + for my $ext ("dat", "def") { + my $lang = "language.$ext"; + info("regenerating $lang\n"); - my $arg1 = "$TEXMFSYSVAR/tex/generic/config/language.$ext"; - my $arg2 = "$TEXMFLOCAL/tex/generic/config/language-local.dat"; - if ($ext eq "dat") { - TeXLive::TLUtils::create_language_dat($localtlpdb, $arg1, $arg2); - } else { - TeXLive::TLUtils::create_language_def($localtlpdb, $arg1, $arg2); - } + my $arg1 = "$TEXMFSYSVAR/tex/generic/config/language.$ext"; + my $arg2 = "$TEXMFLOCAL/tex/generic/config/language-local.dat"; + if ($ext eq "dat") { + TeXLive::TLUtils::create_language_dat($localtlpdb, $arg1, $arg2); + } else { + TeXLive::TLUtils::create_language_def($localtlpdb, $arg1, $arg2); + } - if (! TeXLive::TLUtils::win32()) { - # Use full path for external command, except on Windows. - $lang = "$TEXMFSYSVAR/tex/generic/config/$lang"; - } - if ($localtlpdb->option_create_formats) { - $errors += do_cmd_and_check("fmtutil-sys --byhyphen $lang"); + if (! TeXLive::TLUtils::win32()) { + # Use full path for external command, except on Windows. + $lang = "$TEXMFSYSVAR/tex/generic/config/$lang"; + } + if ($localtlpdb->option_create_formats && !$::regenerate_all_formats) { + $errors += do_cmd_and_check("fmtutil-sys --byhyphen $lang"); + } } } } + # + if ($::regenerate_all_formats) { + $errors += do_cmd_and_check("fmtutil-sys --all"); + } + return $errors; } @@ -540,7 +593,6 @@ sub action_remove { # . check that no collection/scheme still depends on this package # . remove the package # - my %ret; $opts{"no-depends"} = 1 if $opts{"no-depends-at-all"}; my %already_removed; my @more_removal; @@ -605,21 +657,15 @@ sub action_remove { # save the information of which packages have already been removed # into %already_removed. if ($tlp->category eq "Collection") { - my %foo; + my $foo = 0; info ("remove $pkg\n"); - if ($opts{"dry-run"}) { - # we need to set $foo to something positive otherwise - # the rest will not be run in dry_run mode - $foo{'mktexlsr'} = 1; - } else { - merge_into(\%foo, - $localtlmedia->remove_package($pkg)); + if (!$opts{"dry-run"}) { + $foo = $localtlmedia->remove_package($pkg); logpackage("remove: $pkg"); } - if (keys %foo) { + if ($foo) { # removal was successful, so the return is at least 0x0001 mktexlsr # remove dependencies, too - merge_into(\%ret, \%foo); $already_removed{$pkg} = 1; } } else { @@ -635,13 +681,9 @@ sub action_remove { if (!defined($already_removed{$pkg})) { info ("remove $pkg\n"); if (!$opts{"dry-run"}) { - my %foo; - merge_into(\%foo, - $localtlmedia->remove_package($pkg)); - if (keys %foo) { + if ($localtlmedia->remove_package($pkg)) { # removal was successful logpackage("remove: $pkg"); - merge_into(\%ret, \%foo); $already_removed{$pkg} = 1; } } @@ -658,7 +700,6 @@ sub action_remove { } else { info("tlmgr: no packages removed.\n"); } - return(\%ret); } } @@ -670,7 +711,6 @@ sub action_remove { # [xdvi|...|context] paper [help|papersize|--list] # sub action_paper { - my %ret = (); action_gui("config") if $opts{"gui"}; init_local_db(); @@ -694,7 +734,7 @@ sub action_paper { tlwarn("tlmgr: expected `a4' or `letter' after paper, not $newpaper\n"); } else { # tlmgr paper {a4|letter} => do it. - merge_into(\%ret,TeXLive::TLPaper::paper_all($texmfsysconfig,$newpaper)); + TeXLive::TLPaper::paper_all($texmfsysconfig,$newpaper); } } else { # program-specific paper @@ -708,9 +748,8 @@ sub action_paper { # the do_paper progs check for the argument --list, so if given # restore it to the cmd line. unshift(@ARGV, "--list") if $opts{"list"}; - merge_into(\%ret, TeXLive::TLPaper::do_paper($prog,$texmfsysconfig,@ARGV)); + TeXLive::TLPaper::do_paper($prog,$texmfsysconfig,@ARGV); } - return \%ret; } @@ -806,7 +845,6 @@ sub action_show { # SYMLINKS # sub action_symlinks { - my %ret; my $what = shift @ARGV; if (!defined($what) || ($what !~ m/^(add|remove)$/i)) { tlwarn("action symlinks needs one argument, either add or remove\n"); @@ -829,7 +867,6 @@ sub action_symlinks { # SEARCH # sub action_search { - my %ret; my $r = shift @ARGV; my $ret = ""; my $tlpdb; @@ -879,7 +916,6 @@ sub action_restore { # lists all revisions of pkg # tlmgr restore --backupdir dir pkg rev # restores pkg to revision rev - my %ret; # check the backup dir argument if ($opts{"backupdir"}) { my $ob = abs_path($opts{"backupdir"}); @@ -955,20 +991,20 @@ sub action_restore { # first remove the package, then reinstall it # this way we get rid of useless files $opts{"backupdir"} = abs_path($opts{"backupdir"}); - merge_into(\%ret, $localtlmedia->remove_package($pkg)); + $localtlmedia->remove_package($pkg); TeXLive::TLMedia->_install_package("$opts{'backupdir'}/${pkg}.r${rev}.tar.xz" , [] ,$localtlpdb); logpackage("restore: $pkg ($rev)"); # now we have to read the .tlpobj file and add it to the DB my $tlpobj = TeXLive::TLPOBJ->new; $tlpobj->from_file($localtlpdb->root . "/tlpkg/tlpobj/$pkg.tlpobj"); $localtlpdb->add_tlpobj($tlpobj); - merge_into(\%ret, $localtlpdb->get_package($pkg)->make_return_hash_from_executes("enable")); + TeXLive::TLUtils::announce_execute_actions("enable", + $localtlpdb->get_package($pkg)); $localtlpdb->save; } } else { print "revision $rev for $pkg is not present in $opts{'backupdir'}\n"; } - return \%ret; } sub action_backup { @@ -1048,7 +1084,6 @@ sub action_backup { } } - my %ret; my @todo; if ($opts{"all"}) { @todo = $localtlpdb->list_packages; @@ -1072,7 +1107,6 @@ sub action_backup { } } } - return(\%ret); } # @@ -1204,7 +1238,6 @@ sub action_update { } init_local_db(1); $opts{"no-depends"} = 1 if $opts{"no-depends-at-all"}; - my %ret; init_tlmedia(); info("update: dry run, no changes will be made\n") if $opts{"dry-run"}; @@ -1513,7 +1546,7 @@ sub action_update { # package updates if ($opts{"all"} and !($opts{"dry-run"} or $opts{"list"} or $opts{"no-remove"})) { - merge_into(\%ret, $localtlmedia->remove_package($p)); + $localtlmedia->remove_package($p); logpackage("remove: $p"); } } @@ -1535,10 +1568,8 @@ sub action_update { } $currnr++; next if ($opts{"dry-run"} || $opts{"list"}); - my $foo = $tlmediasrc->install_package($pkg, $localtlpdb); - if (ref $foo) { + if ($tlmediasrc->install_package($pkg, $localtlpdb)) { # installation succeeded because we got a reference - merge_into (\%ret, $foo); logpackage("auto-install new: $pkg ($mediarev)"); $nrupdated++; } else { @@ -1616,11 +1647,9 @@ sub action_update { # # the remove_package should also remove empty dirs in case # a dir is changed into a file - merge_into(\%ret, $localtlmedia->remove_package($pkg)); - my $foo = $tlmediasrc->install_package($pkg, $localtlpdb); - if (ref $foo) { + $localtlmedia->remove_package($pkg); + if ($tlmediasrc->install_package($pkg, $localtlpdb)) { # installation succeeded because we got a reference - merge_into (\%ret, $foo); logpackage("update: $pkg ($rev -> $mediarev)"); unlink($unwind_package) if $remove_unwind_container; } else { @@ -1677,7 +1706,6 @@ sub action_update { tlwarn("\nTo change the default for all future updates, run\n"); tlwarn(" tlmgr option location $TeXLiveURL\n\n"); } - return(\%ret); } @@ -1717,7 +1745,6 @@ sub action_install { init_local_db(1); # initialize the TLMedia from $location $opts{"no-depends"} = 1 if $opts{"no-depends-at-all"}; - my %ret; init_tlmedia(); # check for updates to tlmgr itself, and die unless --force is given @@ -1759,7 +1786,7 @@ sub action_install { } info("${re}install: $pkg\n"); if (!$opts{"dry-run"}) { - merge_into(\%ret, $tlmediasrc->install_package($pkg, $localtlpdb)); + $tlmediasrc->install_package($pkg, $localtlpdb); logpackage("${re}install: $pkg"); } } @@ -1767,7 +1794,6 @@ sub action_install { # stop here, don't do any postinstall actions return(0); } - return(\%ret); } sub action_list { @@ -2001,7 +2027,6 @@ sub action_arch { if ($opts{"gui"}) { action_gui("arch"); } - my %ret; my $what = shift @ARGV; init_local_db(1); info("arch: dry run, no changes will be made\n") if $opts{"dry-run"}; @@ -2051,7 +2076,7 @@ sub action_arch { info("Installing $pkg.$a\n"); } else { info("install: $pkg.$a\n"); - merge_into(\%ret, $tlmediasrc->install_package("$pkg.$a", $localtlpdb)); + $tlmediasrc->install_package("$pkg.$a", $localtlpdb); } } } @@ -2060,11 +2085,11 @@ sub action_arch { if (TeXLive::TLUtils::member('win32', @todoarchs)) { # install the necessary w32 stuff info("install: tlperl.win32\n"); - merge_into (\%ret, $tlmediasrc->install_package("tlperl.win32", $localtlpdb)); + $tlmediasrc->install_package("tlperl.win32", $localtlpdb); info("install: tlgs.win32\n"); - merge_into (\%ret, $tlmediasrc->install_package("tlgs.win32", $localtlpdb)); + $tlmediasrc->install_package("tlgs.win32", $localtlpdb); info("install: tlpsv.win32\n"); - merge_into (\%ret, $tlmediasrc->install_package("tlpsv.win32", $localtlpdb)); + $tlmediasrc->install_package("tlpsv.win32", $localtlpdb); } # update the option_archs list of installed archs my @larchs = $localtlpdb->option_available_architectures; @@ -2074,7 +2099,6 @@ sub action_arch { } else { die "Unknown option for arch: $what"; } - return(\%ret); } diff --git a/Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl b/Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl index a9d9b95443a..89835da02e8 100755 --- a/Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl +++ b/Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl @@ -218,7 +218,9 @@ init_hooks(); info(___("loadtlpdbwait") . "\n"); -our $localtlpdb = TeXLive::TLPDB->new ("root" => "$Master"); +our $localtlmedia = TeXLive::TLMedia->new ( $Master ); +die("cannot setup TLMedia in $Master") unless (defined($localtlmedia)); +$localtlpdb = $localtlmedia->tlpdb; die("cannot find tlpdb!") unless (defined($localtlpdb)); our @alllocalpackages = setup_list(0,$localtlpdb->list_packages); diff --git a/Master/tlpkg/TeXLive/TLMedia.pm b/Master/tlpkg/TeXLive/TLMedia.pm index f60462bc82e..773f0550e08 100644 --- a/Master/tlpkg/TeXLive/TLMedia.pm +++ b/Master/tlpkg/TeXLive/TLMedia.pm @@ -224,8 +224,7 @@ sub install_package { $totlpdb->add_tlpobj($tlpobj); $totlpdb->save; # compute the return value - my %ret; - merge_into(\%ret, $tlpobj->make_return_hash_from_executes("enable")); + TeXLive::TLUtils::announce_execute_actions("enable", $tlpobj); if (!$nopostinstall) { # do the postinstallation actions # @@ -235,8 +234,8 @@ sub install_package { $totlpdb->option_desktop_integration, $totlpdb->option_post_code); } - return \%ret; } + return 1; } # @@ -359,13 +358,12 @@ sub remove_package { my ($self, $pkg, $nopostinstall) = @_; my $localtlpdb = $self->tlpdb; my $tlp = $localtlpdb->get_package($pkg); - my %ret; if (!defined($tlp)) { tlwarn ("$pkg: package not present, cannot remove\n"); } else { if ($pkg =~ m/^texlive\.infra/) { log ("Not removing $pkg, it is essential!\n"); - return; + return 0; } # we have to chdir to $localtlpdb->root my $Master = $localtlpdb->root; @@ -439,8 +437,7 @@ sub remove_package { rmdir $d; } $localtlpdb->remove_package($pkg); - merge_into(\%ret, $tlp->make_return_hash_from_executes("disable")); - $ret{'mktexlsr'} = 1; + TeXLive::TLUtils::announce_execute_actions("disable", $tlp); # should we save at each removal??? # advantage: the tlpdb actually reflects what is installed # disadvantage: removing a collection calls the save routine several times @@ -457,7 +454,7 @@ sub remove_package { 0); } } - return \%ret; + return 1; } diff --git a/Master/tlpkg/TeXLive/TLPOBJ.pm b/Master/tlpkg/TeXLive/TLPOBJ.pm index f86195252ee..10db4ff062a 100644 --- a/Master/tlpkg/TeXLive/TLPOBJ.pm +++ b/Master/tlpkg/TeXLive/TLPOBJ.pm @@ -893,47 +893,6 @@ sub allbinfiles { return @ret; } -sub make_return_hash_from_executes { - my $self = shift; - my $type = shift; - if (!defined($type) || (($type ne "enable") && ($type ne "disable"))) { - die "make_return_hash_from_executes: enable or disable, not type $type"; - } - my %ret; - my (@maps, @formats, @dats); - if ($self->runfiles) { - $ret{'mktexlsr'} = 1; - } - if ($self->srcfiles) { - $ret{'mktexlsr'} = 1; - } - if ($self->docfiles) { - $ret{'mktexlsr'} = 1; - } - foreach my $e ($self->executes) { - if ($e =~ m/^add((Mixed)?Map)\s+([^\s]+)\s*$/) { - if ($type eq "enable") { - push @maps, "enable $1=$3"; - } else { - push @maps, "disable $3"; - } - } elsif ($e =~ m/^AddFormat\s+(.*)\s*$/) { - push @formats, $1; - } elsif ($e =~ m/^AddHyphen\s+(.*)\s*$/) { - push @dats, $1; - } else { - tlwarn("Unknown execute $e in ", $self->name, "\n"); - } - } - $ret{'map'} = [ @maps ] if (@maps); - $ret{'format'} = [ @formats ] if (@formats); - $ret{'language'} = [ @dats ] if (@dats); - return(\%ret); -} - - - - # # execute stuff # diff --git a/Master/tlpkg/TeXLive/TLPaper.pm b/Master/tlpkg/TeXLive/TLPaper.pm index 301d6abb65a..66e39adeb07 100644 --- a/Master/tlpkg/TeXLive/TLPaper.pm +++ b/Master/tlpkg/TeXLive/TLPaper.pm @@ -139,8 +139,7 @@ sub get_paper_list { =item C -Call the paper subroutine for C<$prog>, passing args. Return hash of -necessary post-install programs for C to run. +Call the paper subroutine for C<$prog>, passing args. =cut @@ -166,11 +165,9 @@ hashes. =cut sub paper_all { - my %ret; for my $p (sort keys %paper_sub) { - merge_into(\%ret, &{$paper_sub{$p}} (@_)); + &{$paper_sub{$p}} (@_); } - return \%ret; } @@ -212,7 +209,7 @@ sub paper_xdvi { my $newpaper = shift; my $inp = &find_paper_file("xdvi", "other text files", "XDvi"); - return () unless $inp; + return unless $inp; my $outcomp = $paper_config_path_component{"xdvi"} || $default_paper_config_path_component{"xdvi"}; @@ -242,14 +239,13 @@ sub paper_xdvi { sub paper_pdftex { my $outtree = shift; my $newpaper = shift; - my %ret; my $outcomp = $paper_config_path_component{"pdftex"} || $default_paper_config_path_component{"pdftex"}; my $outfile = "$outtree/$outcomp"; my $inp = &find_paper_file("pdftex", "tex", "pdftexconfig.tex"); - return () unless $inp; + return unless $inp; open(FOO, "<$inp") || die "$0: open($inp) failed: $!"; my @lines = ; @@ -338,15 +334,16 @@ sub paper_pdftex { info("$0: setting paper size for pdftex to $newpaper.\n"); mkdirhier(dirname($outfile)); # if we create the outfile we have to call mktexlsr - $ret{"mktexlsr"} = 1 unless (-r $outfile); + TeXLive::TLUtils::announce_execute_actions("files-changed") + unless (-r $outfile); if (!open(TMP, ">$outfile")) { tlwarn("$0: Cannot write to $outfile: $!\n"); tlwarn("Not setting paper size for pdftex.\n"); - return (); + return; } for (@lines) { print TMP; } close(TMP) || warn "$0: close(>$outfile) failed: $!"; - $ret{"format-regenerate"} = 1; + TeXLive::TLUtils::announce_execute_actions("regenerate-formats"); } else { tlwarn("$0: Not a valid paper size for pdftex: $newpaper\n"); } @@ -354,7 +351,6 @@ sub paper_pdftex { } else { info("Current pdftex paper size (from $inp): $currentpaper\n"); } - return \%ret; } @@ -388,10 +384,9 @@ sub paper_pdftex { sub paper_dvips { my $outtree = shift; my $newpaper = shift; - my %ret; my $inp = &find_paper_file("dvips", "dvips config", "config.ps"); - return () unless $inp; + return unless $inp; my $outcomp = $paper_config_path_component{"dvips"} || $default_paper_config_path_component{"dvips"}; @@ -461,7 +456,8 @@ sub paper_dvips { info("$0: setting paper size for dvips to $newpaper.\n"); mkdirhier(dirname($outfile)); # if we create the outfile we have to call mktexlsr - $ret{"mktexlsr"} = 1 unless (-r $outfile); + TeXLive::TLUtils::announce_execute_actions("files-changed") + unless (-r $outfile); if (!open(TMP, ">$outfile")) { tlwarn("$0: Cannot write to $outfile: $!\n"); tlwarn("Not setting paper size for dvips.\n"); @@ -476,7 +472,6 @@ sub paper_dvips { } else { info("Current dvips paper size (from $inp): $papersizes[0]\n"); } - return \%ret; } @@ -587,8 +582,6 @@ sub paper_context { sub paper_do_simple { my ($inp, $prog, $firstre, $secondre, $bl, $outp, $paplist, $defaultpaper, $defaultline, $newpaper) = @_; - my %ret; - debug("file used for $prog: $inp\n"); open(FOO, "<$inp") or die("cannot open file $inp: $!"); @@ -648,7 +641,8 @@ sub paper_do_simple { info("$0: setting paper size for $prog to $newpaper.\n"); mkdirhier(dirname($outp)); # if we create the outfile we have to call mktexlsr - $ret{"mktexlsr"} = 1 unless (-r $outp); + TeXLive::TLUtils::announce_execute_actions("files-changed") + unless (-r $outp); if (!open(TMP, ">$outp")) { tlwarn("$0: Cannot write to $outp: $!\n"); tlwarn("Not setting paper size for $prog.\n"); @@ -656,7 +650,8 @@ sub paper_do_simple { } for (@newlines) { print TMP; } close(TMP) || warn "$0: close(>$outfile) failed: $!"; - $ret{"format-regenerate"} = 1 if $prog eq "context"; + TeXLive::TLUtils::announce_execute_actions("regenerate-formats") + if ($prog eq "context"); } else { tlwarn("$0: Not a valid paper size for $prog: $newpaper\n"); } @@ -665,7 +660,6 @@ sub paper_do_simple { # return the current value info("Current $prog paper size (from $inp): $currentpaper\n"); } - return \%ret; } 1; diff --git a/Master/tlpkg/TeXLive/TLUtils.pm b/Master/tlpkg/TeXLive/TLUtils.pm index 78f622506dd..e58eefc7d37 100644 --- a/Master/tlpkg/TeXLive/TLUtils.pm +++ b/Master/tlpkg/TeXLive/TLUtils.pm @@ -60,6 +60,7 @@ C -- utilities used in the TeX Live infrastructure TeXLive::TLUtils::install_packages($from_tlpdb,$media,$to_tlpdb,$what,$opt_src, $opt_doc)>); TeXLive::TLUtils::install_package($what, $filelistref, $target, $platform); TeXLive::TLUtils::do_postaction($how, $tlpobj); + TeXLive::TLUtils::announce_execute_actions($how, @executes); =head2 Miscellaneous @@ -121,6 +122,7 @@ BEGIN { &tlmd5 &xsystem &run_cmd + &announce_execute_actions ); @EXPORT = qw(setup_programs download_file process_logging_options tlwarn info log debug ddebug dddebug debug_hash @@ -1621,6 +1623,54 @@ sub parse_into_keywords { return($error, %ret); } +=item C + +Announces that the actions given in C<$tlpobj> should be executed +after all packages have been unpacked. + +=cut + +sub announce_execute_actions { + my ($type, $tlp) = @_; + if (defined($type) && ($type eq "regenerate-formats")) { + $::regenerate_all_formats = 1; + return; + } + if (defined($type) && ($type eq "files-changed")) { + $::files_changed = 1; + return; + } + if (!defined($type) || (($type ne "enable") && ($type ne "disable"))) { + die "announce_execute_actions: enable or disable, not type $type"; + } + my (@maps, @formats, @dats); + if ($tlp->runfiles || $tlp->srcfiles || $tlp->docfiles) { + $::files_changed = 1; + } + foreach my $e ($tlp->executes) { + if ($e =~ m/^add((Mixed)?Map)\s+([^\s]+)\s*$/) { + $::execute_actions{$type}{'maps'}{$3} = "$1"; + } elsif ($e =~ m/^AddFormat\s+(.*)\s*$/) { + my %r = TeXLive::TLUtils::parse_AddFormat_line("$1"); + if (defined($r{"error"})) { + tlwarn ("$r{'error'} in parsing $e for return hash\n"); + } else { + $::execute_actions{$type}{'formats'}{$r{'name'}} = \%r; + } + } elsif ($e =~ m/^AddHyphen\s+(.*)\s*$/) { + my %r = TeXLive::TLUtils::parse_AddHyphen_line("$1"); + if (defined($r{"error"})) { + tlwarn ("$r{'error'} in parsing $e for return hash\n"); + } else { + $::execute_actions{$type}{'hyphens'}{$r{'name'}} = \%r; + } + } else { + tlwarn("Unknown execute $e in ", $self->name, "\n"); + } + } +} + + =item C Unpacked C<$tarfile> in C<$targetdir> (changing directories to -- cgit v1.2.3