texlive[68283] Master: tlmgr: on update test that we can remove files

commits+preining at tug.org commits+preining at tug.org
Fri Sep 15 15:11:11 CEST 2023


Revision: 68283
          http://tug.org/svn/texlive?view=revision&revision=68283
Author:   preining
Date:     2023-09-15 15:11:11 +0200 (Fri, 15 Sep 2023)
Log Message:
-----------
tlmgr: on update test that we can remove files (deal with ro dirs)

Modified Paths:
--------------
    trunk/Master/texmf-dist/scripts/texlive/tlmgr.pl
    trunk/Master/tlpkg/TeXLive/TLPDB.pm
    trunk/Master/tlpkg/TeXLive/TLUtils.pm

Modified: trunk/Master/texmf-dist/scripts/texlive/tlmgr.pl
===================================================================
--- trunk/Master/texmf-dist/scripts/texlive/tlmgr.pl	2023-09-14 23:43:19 UTC (rev 68282)
+++ trunk/Master/texmf-dist/scripts/texlive/tlmgr.pl	2023-09-15 13:11:11 UTC (rev 68283)
@@ -3371,8 +3371,11 @@
       if ($pkg =~ m/$CriticalPackagesRegexp/) {
         debug("Not removing critical package $pkg\n");
       } else {
-        $localtlpdb->remove_package($pkg, 
-          "remove-warn-files" => \%do_warn_on_move);
+        if (! $localtlpdb->remove_package($pkg, 
+                "remove-warn-files" => \%do_warn_on_move)) {
+          info("aborted\n") unless $::machinereadable;
+          next;
+        }
       }
       if ($remotetlpdb->install_package($pkg, $localtlpdb)) {
         # installation succeeded because we got a reference
@@ -10253,4 +10256,4 @@
 ### tab-width: 2
 ### indent-tabs-mode: nil
 ### End:
-# vim:set tabstop=2 expandtab: #
+# vim:set tabstop=2 shiftwidth=2 expandtab: #

Modified: trunk/Master/tlpkg/TeXLive/TLPDB.pm
===================================================================
--- trunk/Master/tlpkg/TeXLive/TLPDB.pm	2023-09-14 23:43:19 UTC (rev 68282)
+++ trunk/Master/tlpkg/TeXLive/TLPDB.pm	2023-09-15 13:11:11 UTC (rev 68283)
@@ -2107,14 +2107,27 @@
         0, # tlpdbopt_desktop_integration, desktop part
         $localtlpdb->option("post_code"));
     }
-    # 
-    my @removals = &TeXLive::TLUtils::removed_dirs (@goodfiles);
+    # we want to check whether we can actually remove files
+    # there might be various reasons that this fails, like texmf-dist
+    # directory suddently becoming ro (for whatever definition of
+    # suddenly).
+    my (%by_dirs, %removed_dirs) = &TeXLive::TLUtils::all_dirs_and_removed_dirs (@goodfiles);
+    my @removals = keys %removed_dirs;
+
+    # we have already check for the existence of the dirs returned
+    for my $d (keys %by_dirs) {
+      if (! &TeXLive::TLUtils::dir_writable($d)) {
+        tlwarn("TLPDB: directories are not writable, cannot remove files: $d\n");
+        return 0;
+      }
+    }
+
     # now do the removal
     for my $entry (@goodfiles) {
-      unlink $entry;
+      unlink $entry or tlwarn("Could not unlink $entry: $!\n");
     }
     for my $d (@removals) {
-      rmdir $d;
+      rmdir $d or tlwarn("Could not remove directory $d: $!\n")
     }
     $localtlpdb->remove_tlpobj($pkg);
     TeXLive::TLUtils::announce_execute_actions("disable", $tlp);
@@ -3000,4 +3013,4 @@
 ### tab-width: 2
 ### indent-tabs-mode: nil
 ### End:
-# vim:set tabstop=2 expandtab autoindent: #
+# vim:set tabstop=2 shiftwidth=2 expandtab autoindent: #

Modified: trunk/Master/tlpkg/TeXLive/TLUtils.pm
===================================================================
--- trunk/Master/tlpkg/TeXLive/TLUtils.pm	2023-09-14 23:43:19 UTC (rev 68282)
+++ trunk/Master/tlpkg/TeXLive/TLUtils.pm	2023-09-15 13:11:11 UTC (rev 68283)
@@ -59,6 +59,8 @@
   TeXLive::TLUtils::copy($file, $target_dir);
   TeXLive::TLUtils::touch(@files);
   TeXLive::TLUtils::collapse_dirs(@files);
+  TeXLive::TLUtils::all_dirs_and_removed_dirs(@files);
+  TeXLive::TLUtils::dirs_of_files(@files);
   TeXLive::TLUtils::removed_dirs(@files);
   TeXLive::TLUtils::download_file($path, $destination);
   TeXLive::TLUtils::setup_programs($bindir, $platform);
@@ -210,6 +212,8 @@
     &copy
     &touch
     &collapse_dirs
+    &all_dirs_and_removed_dirs
+    &dirs_of_files
     &removed_dirs
     &install_package
     &install_packages
@@ -1614,30 +1618,14 @@
   return @ret;
 }
 
-=item C<removed_dirs(@files)>
+=item C<dirs_of_files(@files)>
 
-Returns all the directories from which all content will be removed.
-
-Here is the idea:
-
-=over 4
-
-=item create a hashes by_dir listing all files that should be removed
-   by directory, i.e., key = dir, value is list of files
-
-=item for each of the dirs (keys of by_dir and ordered deepest first)
-   check that all actually contained files are removed
-   and all the contained dirs are in the removal list. If this is the
-   case put that directory into the removal list
-
-=item return this removal list
-
-=back
+Returns all the directories in which at least one of the given
+files reside.
 =cut
 
-sub removed_dirs {
+sub dirs_of_files {
   my (@files) = @_;
-  my %removed_dirs;
   my %by_dir;
 
   # construct hash of all directories mentioned, values are lists of the
@@ -1663,6 +1651,21 @@
     $by_dir{$d} = \@a;
   }
 
+  return %by_dir;
+}
+
+=item C<all_dirs_and_removed_dirs(@files)>
+
+Returns all the directories for files and those from which all
+content will be removed.
+
+=cut
+
+sub all_dirs_and_removed_dirs {
+  my (@files) = @_;
+  my %removed_dirs;
+  my %by_dir = dirs_of_files(@files);
+
   # for each of our directories, see if we are removing everything in
   # the directory.  if so, return the directory; else return the
   # individual files.
@@ -1698,9 +1701,37 @@
       $removed_dirs{$d} = 1;
     }
   }
+  return (%by_dir, %removed_dirs);
+}
+
+=item C<removed_dirs(@files)>
+
+Returns all the directories from which all content will be removed.
+
+Here is the idea:
+
+=over 4
+
+=item create a hashes by_dir listing all files that should be removed
+   by directory, i.e., key = dir, value is list of files
+
+=item for each of the dirs (keys of by_dir and ordered deepest first)
+   check that all actually contained files are removed
+   and all the contained dirs are in the removal list. If this is the
+   case put that directory into the removal list
+
+=item return this removal list
+
+=back
+=cut
+
+sub removed_dirs {
+  my (@files) = @_;
+  my (%by_dir, %removed_dirs) = all_dirs_and_removed_dirs(@files);
   return keys %removed_dirs;
 }
 
+
 =item C<time_estimate($totalsize, $donesize, $starttime)>
 
 Returns the current running time and the estimated total time
@@ -5275,4 +5306,4 @@
 ### tab-width: 2
 ### indent-tabs-mode: nil
 ### End:
-# vim:set tabstop=2 expandtab: #
+# vim:set tabstop=2 shiftwidth=2 expandtab: #



More information about the tex-live-commits mailing list.