Bug #77229 [Ana->Nab]: Phar::buildFromDirectory() generates tar archives in 'PAX' format
| From: | nielsdos@php.net | Date: | Sat, 25 Oct 2025 12:48:57 +0000 |
| Subject: | Bug #77229 [Ana->Nab]: Phar::buildFromDirectory() generates tar archives in 'PAX' format | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-251119@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=77229&edit=1
ID: 77229
Updated by: nielsdos@php.net
Reported by: michae dot lee at zerustech dot com
Summary: Phar::buildFromDirectory() generates tar archives in
'PAX' format
-Status: Analyzed
+Status: Not a bug
Type: Bug
Package: PHAR related
Operating System: macOS High Sierra 10.13.6
PHP Version: 7.4
Block user comment: N
Private report: N
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
As described by previous comments there is no bug here.
Previous Comments:
------------------------------------------------------------------------
[2020-11-26 13:28:32] cmb@php.net
This has nothing to do with PAX format (phar tars are in ustar
format), but rather is related to the basic tar format, which is
supposed to store the mtime in header bytes 136-147, but we're
storing the current time[1].
[1] <https://github.com/php/php-src/blob/php-7.4.13/ext/phar/util.c#L577>
------------------------------------------------------------------------
[2018-12-04 06:03:55] hanskrentel at yahoo dot de
It can also be - I think like w/ from iterator - that temporary files are in use behind the secenes
with new timestamps in each operation and therefore changing the checksum.
To create phar file in a reproducible manner it normally needs to store the phar file and then to
modify the binary records resetting the timestamps in there, e.g. to the latest timestamp of the
revision in CVS or in your example you perhaps want to keep track of file-system timestamps and
binary edit the phar file to sync those w/ the file-system.
See the phar build script in the composer project for some reference on how to do that.
------------------------------------------------------------------------
[2018-12-03 03:46:38] michae dot lee at zerustech dot com
PHP version is 7.2.4
------------------------------------------------------------------------
[2018-12-03 02:54:23] michae dot lee at zerustech dot com
Description:
------------
The
Phar::buildFromDirectory() method generates tar archives in PAX
format, so different tar archives that contain the same files may have different sha1
checksums.
Test script:
---------------
<?php
// mkdir test && echo 'hello' > test/test.txt
$phar = new \PharData('a.tar');
$phar->buildFromDirectory('test');
// sleep for 1 second to produce different atime.
sleep(1);
$phar = new \PharData('b.tar');
$phar->buildFromDirectory('test');
echo sha1_file('a.tar') . "\n";
echo sha1_file('b.tar') . "\n";
// a.tar and b.tar contain the same files, but have different checksums
// Looks like the buildFromDirectory() method generates tar archives
// with PAX headers. Calling "tar --format=ustar -cf ..." from command line
// resolves this issue.
Expected result:
----------------
The sha1 checksums for a.tar and b.tar should be the same.
Actual result:
--------------
The sha1 checksums for a.tar and b.tar are different.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=77229&edit=1