Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package perl-PAR-Packer for openSUSE:Factory
checked in at 2022-09-12 19:08:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-PAR-Packer (Old)
and /work/SRC/openSUSE:Factory/.perl-PAR-Packer.new.2083 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-PAR-Packer"
Mon Sep 12 19:08:43 2022 rev:22 rq:1002764 version:1.056
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-PAR-Packer/perl-PAR-Packer.changes
2022-07-05 12:09:55.800595493 +0200
+++
/work/SRC/openSUSE:Factory/.perl-PAR-Packer.new.2083/perl-PAR-Packer.changes
2022-09-12 19:08:47.826628898 +0200
@@ -1,0 +2,24 @@
+Tue Sep 6 03:08:16 UTC 2022 - Tina M??ller <[email protected]>
+
+- updated to 1.056
+ see /usr/share/doc/packages/perl-PAR-Packer/Changes
+
+ 1.056 2022-09-05
+ - Fix #66: patch myldr/boot for "pp --clean ..." without side effects
+ - make sure myldr/boot contains exactly one string of the form
+ "__PASS_PAR_CLEAN__ \0" so that there are no
+ duplicates that may get split on chunk boundaries
+ (myldr/boot_embedded_files.c)
+ - simplify patching of this string (in $loader) to
+ "__PASS_PAR_CLEAN__=1 \0" in script/par.pl
+ - add a test for #66 (check for ephemeral vs persistent cache directory)
+ - Revert "Fixes #62: rs6000_71 (AIX) "An offset in the .loader section
header is too large.""
+ PAR_CLEAN is set too late: at this point PAR_TEMP has already
+ been set (and populated) to a persistent cache directory
+ (/tmp/par-USER/cache-SHA1) instead of an ephemeral one
(/tmp/par-USER/temp-PID).
+ - Some code cleanup
+ - replace some magic numbers with constants
+ - use string interpolation (instead of concatenation)
+ - clean up some convoluted C code
+
+-------------------------------------------------------------------
Old:
----
PAR-Packer-1.055.tar.gz
New:
----
PAR-Packer-1.056.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-PAR-Packer.spec ++++++
--- /var/tmp/diff_new_pack.RfNeS7/_old 2022-09-12 19:08:48.234630045 +0200
+++ /var/tmp/diff_new_pack.RfNeS7/_new 2022-09-12 19:08:48.238630056 +0200
@@ -18,7 +18,7 @@
%define cpan_name PAR-Packer
Name: perl-PAR-Packer
-Version: 1.055
+Version: 1.056
Release: 0
License: Artistic-1.0 OR GPL-1.0-or-later
Summary: PAR Packager
++++++ PAR-Packer-1.055.tar.gz -> PAR-Packer-1.056.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/Changes new/PAR-Packer-1.056/Changes
--- old/PAR-Packer-1.055/Changes 2022-07-03 18:15:37.000000000 +0200
+++ new/PAR-Packer-1.056/Changes 2022-09-05 12:09:30.000000000 +0200
@@ -1,3 +1,26 @@
+1.056 2022-09-05
+
+- Fix #66: patch myldr/boot for "pp --clean ..." without side effects
+
+ - make sure myldr/boot contains exactly one string of the form
+ "__PASS_PAR_CLEAN__ \0" so that there are no
+ duplicates that may get split on chunk boundaries
+ (myldr/boot_embedded_files.c)
+ - simplify patching of this string (in $loader) to
+ "__PASS_PAR_CLEAN__=1 \0" in script/par.pl
+ - add a test for #66 (check for ephemeral vs persistent cache directory)
+
+- Revert "Fixes #62: rs6000_71 (AIX) "An offset in the .loader section header
is too large.""
+
+ PAR_CLEAN is set too late: at this point PAR_TEMP has already
+ been set (and populated) to a persistent cache directory
+ (/tmp/par-USER/cache-SHA1) instead of an ephemeral one
(/tmp/par-USER/temp-PID).
+
+- Some code cleanup
+ - replace some magic numbers with constants
+ - use string interpolation (instead of concatenation)
+ - clean up some convoluted C code
+
1.055 2022-07-03
- Fix #62: rs6000_71 (AIX) "An offset in the .loader section header is too
large."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/MANIFEST
new/PAR-Packer-1.056/MANIFEST
--- old/PAR-Packer-1.055/MANIFEST 2022-07-03 18:24:32.000000000 +0200
+++ new/PAR-Packer-1.056/MANIFEST 2022-09-05 12:10:06.000000000 +0200
@@ -71,6 +71,7 @@
t/85-crt-glob.t
t/85-myfile.t
t/90-gh41.t
+t/90-gh66.t
t/90-rt101800.t
t/90-rt103861.t
t/90-rt104560.t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/META.json
new/PAR-Packer-1.056/META.json
--- old/PAR-Packer-1.055/META.json 2022-07-03 18:24:32.000000000 +0200
+++ new/PAR-Packer-1.056/META.json 2022-09-05 12:10:06.000000000 +0200
@@ -78,6 +78,6 @@
},
"x_MailingList" : "mailto:[email protected]"
},
- "version" : "1.055",
- "x_serialization_backend" : "JSON::PP version 4.10"
+ "version" : "1.056",
+ "x_serialization_backend" : "JSON::PP version 4.11"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/META.yml
new/PAR-Packer-1.056/META.yml
--- old/PAR-Packer-1.055/META.yml 2022-07-03 18:24:32.000000000 +0200
+++ new/PAR-Packer-1.056/META.yml 2022-09-05 12:10:06.000000000 +0200
@@ -48,5 +48,5 @@
MailingList: mailto:[email protected]
bugtracker: https://github.com/rschupp/PAR-Packer/issues
repository: git://github.com/rschupp/PAR-Packer.git
-version: '1.055'
+version: '1.056'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/lib/PAR/Packer.pm
new/PAR-Packer-1.056/lib/PAR/Packer.pm
--- old/PAR-Packer-1.055/lib/PAR/Packer.pm 2022-01-27 12:01:23.000000000
+0100
+++ new/PAR-Packer-1.056/lib/PAR/Packer.pm 2022-09-05 11:13:07.000000000
+0200
@@ -3,7 +3,7 @@
use strict;
use warnings;
-our $VERSION = '1.055';
+our $VERSION = '1.056';
=head1 NAME
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/myldr/Makefile.PL
new/PAR-Packer-1.056/myldr/Makefile.PL
--- old/PAR-Packer-1.055/myldr/Makefile.PL 2022-01-25 15:10:29.000000000
+0100
+++ new/PAR-Packer-1.056/myldr/Makefile.PL 2022-08-30 14:35:36.000000000
+0200
@@ -256,7 +256,7 @@
clean::
-\$(RM_F) boot_embedded_files.c my_par_pl.c
- -\$(RM_F) $(OBJECTS)
+ -\$(RM_F) \$(OBJECTS)
-\$(RM_F) *.opt *.pdb perlxsi.c
-\$(RM_F) usernamefrompwuid.h
-\$(RM_F) $par_exe $boot_exe @parl_exes Dynamic.pm Static.pm
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/myldr/boot.c
new/PAR-Packer-1.056/myldr/boot.c
--- old/PAR-Packer-1.055/myldr/boot.c 2022-02-13 17:53:43.000000000 +0100
+++ new/PAR-Packer-1.056/myldr/boot.c 2022-09-05 11:40:44.000000000 +0200
@@ -125,7 +125,7 @@
/* seek file descriptor fd to member Subsystem (a WORD) of the
* IMAGE_OPTIONAL_HEADER structure of a Windows executable
* (so that the next 2 bytes read/written from/to fd get/set Subsystem);
- * cf. sub _fix_console in PAR/Packer.pm
+ * cf. sub _fix_console in PAR/Packer.pm
*/
void seek_to_subsystem( int fd ) {
BYTE buf[64];
@@ -205,6 +205,11 @@
char pp_version_info[] = "@(#) Packed by PAR::Packer " PAR_PACKER_VERSION;
+/* the contents of this string (in the executable myldr/boot)
+ * will be patched by script/par.pl if option "--clean" is used with pp
+ */
+static char pass_par_clean[] = "__PASS_PAR_CLEAN__ \0";
+
int main ( int argc, char **argv, char **env )
{
int rc;
@@ -225,6 +230,15 @@
par_init_env();
+ /* check for patched content of pass_par_clean */
+ {
+ char *equals = strchr(pass_par_clean, '=');
+ if (equals != NULL) {
+ equals[2] = '\0'; /* trim value to one byte */
+ par_setenv("PAR_CLEAN", equals + 1);
+ }
+ }
+
stmpdir = par_mktmpdir( argv );
if ( !stmpdir ) die(""); /* error message has already been printed
*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/myldr/mktmpdir.c
new/PAR-Packer-1.056/myldr/mktmpdir.c
--- old/PAR-Packer-1.055/myldr/mktmpdir.c 2021-04-06 10:31:54.000000000
+0200
+++ new/PAR-Packer-1.056/myldr/mktmpdir.c 2022-09-05 12:07:25.000000000
+0200
@@ -222,6 +222,15 @@
}
if ( !par_env_clean() && (f = open( progname, O_RDONLY | OPEN_O_BINARY )))
{
+ /* TODO The following should implement the full search for the PAR
magic
+ * string ("\nPAR.pm\n") as implemented in find_par_magic() in
script/par.pl
+ * and then use that position to look for "\0CACHE".
+ * E.g. signed pp-packed executables don't have "\0CACHE" in position
18 bytes
+ * from the end of the executables.
+ * But in this case the code below will just resort to compute the
SHA1 of the
+ * executable on the fly and thus provide a stable cache directory path
+ * (though perhaps a little less efficient).
+ */
lseek(f, -18, 2);
read(f, buf, 6);
if(buf[0] == 0 && buf[1] == 'C' && buf[2] == 'A' && buf[3] == 'C' &&
buf[4] == 'H' && buf[5] == 'E') {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/myldr/run_with_inc.pl
new/PAR-Packer-1.056/myldr/run_with_inc.pl
--- old/PAR-Packer-1.055/myldr/run_with_inc.pl 2020-03-08 23:54:55.000000000
+0100
+++ new/PAR-Packer-1.056/myldr/run_with_inc.pl 2022-08-30 14:35:36.000000000
+0200
@@ -10,4 +10,4 @@
# then execute it
splice @ARGV, 1, 0, map { "-I$_" } @INC;
system(@ARGV) == 0
- or die "system(@ARGV) failed: $!\n";
+ or die "system(@ARGV) failed: \$?=$?\n";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/myldr/utils.c
new/PAR-Packer-1.056/myldr/utils.c
--- old/PAR-Packer-1.055/myldr/utils.c 2022-07-01 23:09:24.000000000 +0200
+++ new/PAR-Packer-1.056/myldr/utils.c 2022-09-05 11:40:44.000000000 +0200
@@ -20,6 +20,7 @@
#else
# include <fcntl.h>
#endif
+#include <string.h>
#include <stdio.h>
#include "env.c"
@@ -83,9 +84,7 @@
char *par_findprog(char *prog, const char *path) {
- char *p, filename[MAXPATHLEN];
- /* char *ret; */ /* Commented out for reason described below */
- int proglen, plen;
+ char *p, *endp, filename[MAXPATHLEN];
char *par_temp = par_getenv("PAR_TEMP");
/* NOTE: This code is #include'd both from a plain C program (boot.c)
@@ -117,37 +116,35 @@
Basically, execvp( "/full/path/to/prog", "prog", NULL ) and
"/full/path/to" isn't in $PATH. Of course, I can't think
of a situation this will happen. */
- proglen = strlen(prog);
- p = strtok(strdup(path), path_sep);
- /* Note: use a copy of path as strtok() modifies its first argument */
- while ( p != NULL ) {
+ /* Note: use a copy of path as strtok() modifies its first argument */
+ for (p = strtok(strdup(path), path_sep); p != NULL; p = strtok(NULL,
path_sep)) {
+ /* an empty PATH element means the current directory */
if (*p == '\0') p = ".";
if ( par_temp != NULL && ( strcmp(par_temp, p) == 0 ) ) {
- p = strtok(NULL, path_sep);
continue;
}
- plen = strlen(p);
-
/* strip trailing '/' */
- while (p[plen-1] == *dir_sep) {
- p[--plen] = '\0';
+ endp = p + strlen(p) - 1;
+ while (p < endp && *endp == *dir_sep) {
+ *endp ='\0';
+ endp--;
}
- if (plen + 1 + proglen >= MAXPATHLEN) {
+ if (strlen(p) + 1 + strlen(prog) >= MAXPATHLEN) {
par_setenv("PAR_PROGNAME", prog);
return prog;
}
sprintf(filename, "%s%s%s", p, dir_sep, prog);
- if ((stat(filename, &statbuf) == 0) && S_ISREG(statbuf.st_mode) &&
- access(filename, X_OK) == 0) {
+ if (stat(filename, &statbuf) == 0
+ && S_ISREG(statbuf.st_mode)
+ && access(filename, X_OK) == 0) {
par_setenv("PAR_PROGNAME", filename);
return strdup(filename);
}
- p = strtok(NULL, path_sep);
}
par_setenv("PAR_PROGNAME", prog);
@@ -156,57 +153,41 @@
char *par_basename (const char *name) {
- const char *base = name;
- const char *p;
-
- for (p = name; *p; p++) {
- if (*p == *dir_sep) base = p + 1;
- }
-
- return (char*)base;
+ char *base = strrchr(name, *dir_sep);
+ return strdup(base != NULL ? base + 1 : name);
}
-
-
char *par_dirname (const char *path) {
- static char bname[MAXPATHLEN];
- register const char *endp;
+ char dname[MAXPATHLEN];
+ char *endp;
/* Empty or NULL string gets treated as "." */
if (path == NULL || *path == '\0') {
return strdup(".");
}
- /* Strip trailing slashes */
- endp = path + strlen(path) - 1;
- while (endp > path && *endp == *dir_sep) endp--;
-
- /* Find the start of the dir */
- while (endp > path && *endp != *dir_sep) endp--;
+ if (strlen(path) + 1 > sizeof(dname))
+ return NULL;
- /* Either the dir is "/" or there are no slashes */
- if (endp == path) {
- if (*endp == *dir_sep) {
- return strdup(".");
- }
- else {
- return strdup(dir_sep);
- }
- } else {
- do {
- endp--;
- } while (endp > path && *endp == *dir_sep);
- }
+ strcpy(dname, path);
- if (endp - path + 2 > sizeof(bname)) {
- return NULL;
+ /* Strip trailing slashes */
+ endp = dname + strlen(dname) - 1;
+ while (endp > dname && *endp == *dir_sep) {
+ *endp = '\0';
+ endp--;
}
- strncpy(bname, path, endp - path + 1);
- return bname;
+ endp = strrchr(dname, *dir_sep);
+ if (endp == NULL)
+ return strdup(".");
+ if (endp > dname)
+ *endp = '\0';
+ return strdup(dname);
}
+
void par_init_env () {
char *buf;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/script/par.pl
new/PAR-Packer-1.056/script/par.pl
--- old/PAR-Packer-1.055/script/par.pl 2022-07-03 17:59:12.000000000 +0200
+++ new/PAR-Packer-1.056/script/par.pl 2022-09-05 12:07:25.000000000 +0200
@@ -154,8 +154,39 @@
=cut
+my ($PAR_MAGIC, $FILE_offset_size, $CACHE_marker, $cache_name_size);
+# NOTE: must initialize them in BEGIN as they are used in BEGIN below
+BEGIN {
+ $PAR_MAGIC = "\nPAR.pm\n";
+ $FILE_offset_size = 4; # pack("N")
+ $cache_marker = "\0CACHE";
+ $cache_name_size = 40;
+}
+
+
+# Search $fh for the "\nPAR.pm\n signature backward from the end of the file
+sub find_par_magic
+{
+ my ($fh) = @_;
-my ($PAR_MAGIC, $par_temp, $progname, @tmpfile, %ModuleCache);
+ my $chunk_size = 64 * 1024;
+ my $buf;
+ my $size = -s $fh;
+
+ my $pos = $size - $size % $chunk_size; # NOTE: $pos is a multiple of
$chunk_size
+ while ($pos >= 0) {
+ seek $fh, $pos, 0;
+ read $fh, $buf, $chunk_size + length($PAR_MAGIC);
+ if ((my $i = rindex($buf, $PAR_MAGIC)) >= 0) {
+ $pos += $i;
+ return $pos;
+ }
+ $pos -= $chunk_size;
+ }
+ return -1;
+}
+
+my ($par_temp, $progname, @tmpfile, %ModuleCache);
END { if ($ENV{PAR_CLEAN}) {
require File::Temp;
require File::Basename;
@@ -204,9 +235,8 @@
}
} }
-BEGIN {
- $PAR_MAGIC = "\nPAR.pm\n";
+BEGIN {
Internals::PAR::BOOT() if defined &Internals::PAR::BOOT;
eval {
@@ -240,20 +270,7 @@
}
# Search for the "\nPAR.pm\n signature backward from the end of the file
- my $chunk_size = 64 * 1024;
- my $buf;
- my $size = -s _FH;
-
- my $magic_pos = $size - $size % $chunk_size; # NOTE: $magic_pos is a
multiple of $chunk_size
- while ($magic_pos >= 0) {
- seek _FH, $magic_pos, 0;
- read _FH, $buf, $chunk_size + length($PAR_MAGIC);
- if ((my $i = rindex($buf, $PAR_MAGIC)) >= 0) {
- $magic_pos += $i;
- last;
- }
- $magic_pos -= $chunk_size;
- }
+ my $magic_pos = find_par_magic(*_FH);
if ($magic_pos < 0) {
outs(qq[Can't find magic string "$PAR_MAGIC" in file "$progname"]);
last MAGIC;
@@ -262,11 +279,11 @@
# Seek 4 bytes backward from the signature to get the offset of the
# first embedded FILE, then seek to it
- seek _FH, $magic_pos - 4, 0;
- read _FH, $buf, 4;
+ seek _FH, $magic_pos - $FILE_offset_size, 0;
+ read _FH, $buf, $FILE_offset_size;
my $offset = unpack("N", $buf);
outs("Offset from start of FILEs is $offset");
- seek _FH, $magic_pos - 4 - $offset, 0;
+ seek _FH, $magic_pos - $FILE_offset_size - $offset, 0;
$data_pos = tell _FH;
# }}}
@@ -382,7 +399,6 @@
delete $ENV{PAR_APP_REUSE}; # sanitize (REUSE may be a security problem)
-$quiet = 0 unless $ENV{PAR_DEBUG};
# Don't swallow arguments for compiled executables without --par-options
if (!$start_pos or ($ARGV[0] eq '--par-options' && shift)) {
my %dist_cmd = qw(
@@ -477,6 +493,15 @@
}
+ # Extract the "par" dictionary from META.yml in $zip
+ my %meta_par = do {
+ if ($zip and my $meta = $zip->contents('META.yml')) {
+ $meta =~ s/.*^par:$//ms;
+ $meta =~ s/^\S.*//ms;
+ $meta =~ /^ ([^:]+): (.+)$/mg;
+ }
+ };
+
# Open input and output files {{{
if (defined $par) {
@@ -511,6 +536,18 @@
PAR::Filter::PodStrip->apply(\$loader, $0);
}
+ # Patch a certain string in $loader
+ if ($meta_par{clean}) {
+ my $par_clean = "=1";
+ my $pass_par_clean = uc "__pass_par_clean__";
+ # NOTE: we avoid to mention the contents of pass_par_clean so that
+ # this file doesn't contain it **at all**
+
+ $loader =~ s{(?<=${pass_par_clean})( +)}
+ {$par_clean . (" " x (length($1) - length($par_clean)))}eg;
+ # NOTE: the replacement must be the same number of bytes
as the match
+ }
+
$fh->print($loader)
or die qq[Error writing loader to "$out": $!];
# }}}
@@ -611,7 +648,7 @@
or die qq[Error writing zip part of "$out"];
}
- $cache_name = substr $cache_name, 0, 40;
+ $cache_name = substr $cache_name, 0, $cache_name_size;
if (!$cache_name and my $mtime = (stat($out))[9]) {
my $ctx = Digest::SHA->new(1);
open my $th, "<:raw", $out;
@@ -620,8 +657,8 @@
$cache_name = $ctx->hexdigest;
}
- $cache_name .= "\0" x (40 - length $cache_name);
- $cache_name .= "\0CACHE";
+ $cache_name .= "\0" x ($cache_name_size - length $cache_name);
+ $cache_name .= $cache_marker;
# compute the offset from the end of $loader to end of "...\0CACHE"
my $offset = $fh->tell + length($cache_name) - length($loader);
$fh->print($cache_name,
@@ -664,19 +701,6 @@
or die qq[Error reading zip archive "$progname"];
Archive::Zip::setChunkSize(64 * 1024);
- $quiet = !$ENV{PAR_DEBUG};
-
- outs("Reading META.yml...");
- if (my $meta = $zip->contents('META.yml')) {
- # check par.clean
- $meta =~ s/.*^par:\s*$//ms;
- $meta =~ s/^\S.*//ms;
- if (my ($clean) = $meta =~ /^\s+clean: (.*)$/m) {
- $clean =~ /^\s*|\s*$/g;
- $ENV{PAR_CLEAN} = 1 if $clean;
- }
- }
-
push @PAR::LibCache, $zip;
$PAR::LibCache{$progname} = $zip;
@@ -796,43 +820,42 @@
else {
$username = $ENV{USERNAME} || $ENV{USER} || 'SYSTEM';
}
- $username =~ s/\W/_/g;
my $stmpdir = "$path$sys{_delim}par-".unpack("H*", $username);
mkdir $stmpdir, 0755;
- if (!$ENV{PAR_CLEAN} and my $mtime = (stat($progname))[9]) {
- open my $fh, "<:raw", $progname or die qq[Can't read "$progname":
$!];
- seek $fh, -18, 2;
- my $buf;
- read $fh, $buf, 6;
- if ($buf eq "\0CACHE") {
- seek $fh, -58, 2;
- read $fh, $buf, 41;
- $buf =~ s/\0//g;
- $stmpdir .= "$sys{_delim}cache-$buf";
- }
- else {
- my $digest = eval
- {
- require Digest::SHA;
- my $ctx = Digest::SHA->new(1);
- open my $fh, "<:raw", $progname or die qq[Can't read
"$progname": $!];
- $ctx->addfile($fh);
- close($fh);
- $ctx->hexdigest;
- } || $mtime;
- $stmpdir .= "$sys{_delim}cache-$digest";
- }
- close($fh);
+ my $cache_dir;
+ if ($ENV{PAR_CLEAN}) {
+ $cache_dir = "temp-$$";
}
else {
+ open my $fh, "<:raw", $progname or die qq[Can't read "$progname":
$!];
+ if ((my $magic_pos = find_par_magic($fh)) >= 0) {
+ seek $fh, $magic_pos
+ - $FILE_offset_size
+ - length($cache_marker), 0;
+ my $buf;
+ read $fh, $buf, length($cache_marker);
+ if ($buf eq $cache_marker) {
+ seek $fh, $magic_pos
+ - $FILE_offset_size
+ - length($cache_marker)
+ - $cache_name_size, 0;
+ read $fh, $buf, $cache_name_size;
+ $buf =~ s/\0//g;
+ $cache_dir = "cache-$buf";
+ }
+ }
+ close $fh;
+ }
+ if (!$cache_dir) {
+ $cache_dir = "temp-$$";
$ENV{PAR_CLEAN} = 1;
- $stmpdir .= "$sys{_delim}temp-$$";
}
+ $stmpdir .= "$sys{_delim}$cache_dir";
- $ENV{PAR_TEMP} = $stmpdir;
mkdir $stmpdir, 0755;
+ $ENV{PAR_TEMP} = $stmpdir;
last;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/PAR-Packer-1.055/t/90-gh66.t
new/PAR-Packer-1.056/t/90-gh66.t
--- old/PAR-Packer-1.055/t/90-gh66.t 1970-01-01 01:00:00.000000000 +0100
+++ new/PAR-Packer-1.056/t/90-gh66.t 2022-09-05 12:04:03.000000000 +0200
@@ -0,0 +1,30 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use File::Basename;
+
+use Test::More;
+require "./t/utils.pl";
+
+plan tests => 10;
+
+my ($exe, $out, %val);
+my $script = 'print qq[PAR_TEMP=$ENV{PAR_TEMP}\nPAR_CLEAN=$ENV{PAR_CLEAN}\n]';
+
+$exe = pp_ok( -e => $script );
+($out) = run_ok($exe);
+#diag($out);
+%val = $out =~ /^(PAR_\w+)=(.*)$/gm;
+like( basename($val{PAR_TEMP}), qr/^cache-/, "$val{PAR_TEMP} is a persistent
cache directory" );
+ok(!$val{PAR_CLEAN}, "won't clean");
+ok(-d $val{PAR_TEMP}, "cache directory still exists");
+
+$exe = pp_ok( "--clean", -e => $script );
+($out) = run_ok($exe);
+#diag($out);
+%val = $out =~ /^(PAR_\w+)=(.*)$/gm;
+like( basename($val{PAR_TEMP}), qr/^temp-/, "$val{PAR_TEMP} is an ephemeral
cache directory" );
+ok($val{PAR_CLEAN}, "will clean");
+ok(!-e $val{PAR_TEMP}, "cache directory has been removed");
+