summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xMaster/texmf/scripts/texlive/tlmgr.pl75
1 files changed, 71 insertions, 4 deletions
diff --git a/Master/texmf/scripts/texlive/tlmgr.pl b/Master/texmf/scripts/texlive/tlmgr.pl
index abbc75ef88e..25c2256995f 100755
--- a/Master/texmf/scripts/texlive/tlmgr.pl
+++ b/Master/texmf/scripts/texlive/tlmgr.pl
@@ -1343,7 +1343,10 @@ sub action_backup {
# =====================================================================
#
sub write_w32_updater {
- my ($restart_tlmgr, @w32_updated) = @_;
+ my ($restart_tlmgr, $ref_files_to_be_removed, @w32_updated) = @_;
+ my @infra_files_to_be_removed = @$ref_files_to_be_removed;
+ @infra_files_to_be_removed =~ s!/!\\!g; # to keep del command happy
+ # TODO do something with these files TODO
my $media = $tlmediasrc->media;
my $mediatlpdb = $tlmediasrc->tlpdb;
# we have to download/copy also the src/doc files if necessary!
@@ -1988,7 +1991,6 @@ sub action_update {
#
foreach my $pkg (@inst_packs, @inst_colls, @inst_schemes) {
# skip this loop if infra update on w32
- last if (win32() && $opts{"self"});
next if ($pkg =~ m/^00texlive/);
my $tlp = $localtlpdb->get_package($pkg);
# we checked already that this package is present!
@@ -2010,6 +2012,11 @@ sub action_update {
}
$updated{$pkg} = 1;
next;
+ } elsif (win32() && $opts{"self"}) {
+ # we pretend that the update happened
+ # in order to calculate file changes properly
+ $updated{$pkg} = 1;
+ next;
}
if ($opts{"backup"} && !$opts{"dry-run"}) {
@@ -2125,10 +2132,66 @@ sub action_update {
# check that if updates to the critical packages are present all of
# them have been successfully updated
my $infra_update_done = 1;
+ my @infra_files_to_be_removed;
for my $pkg (@critical) {
- $infra_update_done &&= $updated{$pkg} if (defined($updated{$pkg}));
+ next unless (defined($updated{$pkg}));
+ $infra_update_done &&= $updated{$pkg};
+ my (@old_infra_files, @new_infra_files);
+ my $oldtlp;
+ my $newtlp;
+ if ($updated{$pkg}) {
+ $oldtlp = $localtlpdb->get_package($pkg);
+ $newtlp = $tlmediatlpdb->get_package($pkg);
+ } else {
+ # update failed but we could introduce new files, that
+ # should be removed now as a part of restoring backup
+ $oldtlp = $tlmediatlpdb->get_package($pkg);
+ $newtlp = $localtlpdb->get_package($pkg);
+ }
+ die ("That shouldn't happen: $p not found in tlpdb") if !defined($newtlp);
+ die ("That shouldn't happen: $p not found in tlpdb") if !defined($oldtlp);
+ my @old_infra_files = $oldtlp->all_files;
+ my @new_infra_files = $newtlp->all_files;
+ my %del_files;
+ @del_files{@old_infra_files} = ();
+ delete @del_files{@new_infra_files};
+ for my $k (keys %del_files) {
+ my @found_pkgs = $localtlpdb->find_file($k);
+ if ($#found_pkgs >= 0) {
+ my $bad_file = 1;
+ if (win32()) {
+ # on win32 the packages have not been removed already,
+ # so we check that the only package listed in @found_pkgs
+ # is the one we are working on ($pkg)
+ if ($#found_pkgs == 0 && $found_pkgs[0] =~ m/^$pkg:/) {
+ # only one package has been returned and it
+ # matches the current package followed by a colon
+ # remember the TLPDB->find_file returns
+ # $pkg:$file
+ # in this case we can ignore it
+ $bad_file = 0;
+ }
+ }
+ if ($bad_file) {
+ tlwarn("The file $k has disappeared from the critical" .
+ "package $pkg but is still present in @found_pkgs\n");
+ } else {
+ push @infra_files_to_be_removed, $k;
+ }
+ } else {
+ push @infra_files_to_be_removed, $k;
+ }
+ }
}
+ if (!win32()) {
+ for my $f (@infra_files_to_be_removed) {
+ # TODO actually unlink the stuff
+ #unlink("$Master/$f");
+ debug("removing disappearing file $f\n");
+ }
+ }
+
# check if any additional updates are asked for
my $other_updates_asked_for = 0;
if ($opts{"all"}) {
@@ -2153,7 +2216,11 @@ sub action_update {
# infra update and tlmgr restart on win32 is done by the updater batch script
if (win32() && !$opts{"list"} && @critical) {
info("Preparing TeX Live infrastructure update...\n");
- my $ret = write_w32_updater($restart_tlmgr, @critical);
+ for my $f (@infra_files_to_be_removed) {
+ debug("file scheduled for removal $f\n");
+ }
+ my $ret = write_w32_updater($restart_tlmgr,
+ \@infra_files_to_be_removed, @critical);
if ($ret) {
tlwarn ("Aborting infrastructure update.\n");
$restart_tlmgr = 0 if ($opts{"dry-run"});