diff --git a/.gitignore b/.gitignore index 701377779..99ac1f45a 100644 --- a/.gitignore +++ b/.gitignore @@ -44,6 +44,9 @@ brick/math/psalm*.xmls deepdiver/zipstreamer/test +deepdiver1975/tarstreamer/.drone.star +deepdiver1975/tarstreamer/vendor-bin + doctrine/dbal/.doctrine-project.json doctrine/dbal/.gitmodules doctrine/dbal/build.* diff --git a/composer.json b/composer.json index 1719ba9e8..d050fd7ab 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "bantu/ini-get-wrapper": "v1.0.1", "cweagans/composer-patches": "^1.7", "deepdiver/zipstreamer": "2.0.0", - "deepdiver1975/tarstreamer": "v2.0.0", + "deepdiver1975/tarstreamer": "^2.1.0", "doctrine/dbal": "3.3.8", "egulias/email-validator": "^3.2.5", "fusonic/opengraph": "^2.2", diff --git a/composer.lock b/composer.lock index 27347b9f5..2290de4a6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6f8040d64f3a15565ad68a7ba690bb6b", + "content-hash": "a98e5600f6206681bdc8d588b7acc7d6", "packages": [ { "name": "aws/aws-crt-php", @@ -422,27 +422,33 @@ }, { "name": "deepdiver1975/tarstreamer", - "version": "2.0.0", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/owncloud/TarStreamer.git", - "reference": "ad48505d1ab54a8e94e6b1cc5297bbed72e956de" + "reference": "163052d7a076fd3dd54d4f50e1ff2705b72604db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/owncloud/TarStreamer/zipball/ad48505d1ab54a8e94e6b1cc5297bbed72e956de", - "reference": "ad48505d1ab54a8e94e6b1cc5297bbed72e956de", + "url": "https://api.github.com/repos/owncloud/TarStreamer/zipball/163052d7a076fd3dd54d4f50e1ff2705b72604db", + "reference": "163052d7a076fd3dd54d4f50e1ff2705b72604db", "shasum": "" }, "require": { "php": ">=7.1" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.5", "pear/archive_tar": "~1.4", - "pear/pear-core-minimal": "v1.10.10", - "phpunit/phpunit": "^7.5" + "pear/pear-core-minimal": "v1.10.13", + "phpunit/phpunit": "^7.5|^8.5|^9.6" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false + } + }, "autoload": { "psr-4": { "ownCloud\\TarStreamer\\": "src/" @@ -460,7 +466,11 @@ "stream", "tar" ], - "time": "2020-01-08T09:55:35+00:00" + "support": { + "issues": "https://github.com/owncloud/TarStreamer/issues", + "source": "https://github.com/owncloud/TarStreamer/tree/v2.1.0" + }, + "time": "2023-06-16T08:01:55+00:00" }, { "name": "doctrine/cache", diff --git a/composer/installed.json b/composer/installed.json index 76e5e8f5c..3666f43a0 100644 --- a/composer/installed.json +++ b/composer/installed.json @@ -437,29 +437,35 @@ }, { "name": "deepdiver1975/tarstreamer", - "version": "2.0.0", - "version_normalized": "2.0.0.0", + "version": "v2.1.0", + "version_normalized": "2.1.0.0", "source": { "type": "git", "url": "https://github.com/owncloud/TarStreamer.git", - "reference": "ad48505d1ab54a8e94e6b1cc5297bbed72e956de" + "reference": "163052d7a076fd3dd54d4f50e1ff2705b72604db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/owncloud/TarStreamer/zipball/ad48505d1ab54a8e94e6b1cc5297bbed72e956de", - "reference": "ad48505d1ab54a8e94e6b1cc5297bbed72e956de", + "url": "https://api.github.com/repos/owncloud/TarStreamer/zipball/163052d7a076fd3dd54d4f50e1ff2705b72604db", + "reference": "163052d7a076fd3dd54d4f50e1ff2705b72604db", "shasum": "" }, "require": { "php": ">=7.1" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.5", "pear/archive_tar": "~1.4", - "pear/pear-core-minimal": "v1.10.10", - "phpunit/phpunit": "^7.5" + "pear/pear-core-minimal": "v1.10.13", + "phpunit/phpunit": "^7.5|^8.5|^9.6" }, - "time": "2020-01-08T09:55:35+00:00", + "time": "2023-06-16T08:01:55+00:00", "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false + } + }, "installation-source": "dist", "autoload": { "psr-4": { @@ -478,6 +484,10 @@ "stream", "tar" ], + "support": { + "issues": "https://github.com/owncloud/TarStreamer/issues", + "source": "https://github.com/owncloud/TarStreamer/tree/v2.1.0" + }, "install-path": "../deepdiver1975/tarstreamer" }, { diff --git a/composer/installed.php b/composer/installed.php index bd0e8d1eb..caf1c0498 100644 --- a/composer/installed.php +++ b/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'nextcloud/3rdparty', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'cda5f3a36ed1880823a373ba79801f0e75bd5c8d', + 'reference' => 'ac62120ff1cdcdac50ad931ee0988ab337867a01', 'type' => 'library', 'install_path' => __DIR__ . '/../', 'aliases' => array(), @@ -74,9 +74,9 @@ 'dev_requirement' => false, ), 'deepdiver1975/tarstreamer' => array( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'reference' => 'ad48505d1ab54a8e94e6b1cc5297bbed72e956de', + 'pretty_version' => 'v2.1.0', + 'version' => '2.1.0.0', + 'reference' => '163052d7a076fd3dd54d4f50e1ff2705b72604db', 'type' => 'library', 'install_path' => __DIR__ . '/../deepdiver1975/tarstreamer', 'aliases' => array(), @@ -310,7 +310,7 @@ 'nextcloud/3rdparty' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => 'cda5f3a36ed1880823a373ba79801f0e75bd5c8d', + 'reference' => 'ac62120ff1cdcdac50ad931ee0988ab337867a01', 'type' => 'library', 'install_path' => __DIR__ . '/../', 'aliases' => array(), diff --git a/deepdiver1975/tarstreamer/.phan/config.php b/deepdiver1975/tarstreamer/.phan/config.php new file mode 100644 index 000000000..98c5d937f --- /dev/null +++ b/deepdiver1975/tarstreamer/.phan/config.php @@ -0,0 +1,108 @@ + + * + * @copyright Copyright (c) 2018, ownCloud GmbH + * @license GPL-2.0 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +return [ + + // Supported values: '7.2', '7.3', '7.4', '8.0', null. + // If this is set to null, + // then Phan assumes the PHP version which is closest to the minor version + // of the php executable used to execute phan. + 'target_php_version' => null, + + // A list of directories that should be parsed for class and + // method information. After excluding the directories + // defined in exclude_analysis_directory_list, the remaining + // files will be statically analyzed for errors. + // + // Thus, both first-party and third-party code being used by + // your application should be included in this list. + 'directory_list' => [ + 'src', + 'vendor', + ], + + // A list of files to include in analysis + 'file_list' => [ + ], + + // A directory list that defines files that will be excluded + // from static analysis, but whose class and method + // information should be included. + // + // Generally, you'll want to include the directories for + // third-party code (such as "vendor/") in this list. + // + // n.b.: If you'd like to parse but not analyze 3rd + // party code, directories containing that code + // should be added to both the `directory_list` + // and `exclude_analysis_directory_list` arrays. + 'exclude_analysis_directory_list' => [ + 'vendor', + ], + + // A regular expression to match files to be excluded + // from parsing and analysis and will not be read at all. + // + // This is useful for excluding groups of test or example + // directories/files, unanalyzable files, or files that + // can't be removed for whatever reason. + // (e.g. '@Test\.php$@', or '@vendor/.*/(tests|Tests)/@') + 'exclude_file_regex' => '@.*/[^/]*(tests|Tests|templates)/@', + + // If true, missing properties will be created when + // they are first seen. If false, we'll report an + // error message. + "allow_missing_properties" => false, + + // If enabled, allow null to be cast as any array-like type. + // This is an incremental step in migrating away from null_casts_as_any_type. + // If null_casts_as_any_type is true, this has no effect. + "null_casts_as_any_type" => true, + + // Backwards Compatibility Checking. This is slow + // and expensive, but you should consider running + // it before upgrading your version of PHP to a + // new version that has backward compatibility + // breaks. + 'backward_compatibility_checks' => false, + + // The initial scan of the function's code block has no + // type information for `$arg`. It isn't until we see + // the call and rescan test()'s code block that we can + // detect that it is actually returning the passed in + // `string` instead of an `int` as declared. + 'quick_mode' => false, + + // The minimum severity level to report on. This can be + // set to Issue::SEVERITY_LOW, Issue::SEVERITY_NORMAL or + // Issue::SEVERITY_CRITICAL. Setting it to only + // critical issues is a good place to start on a big + // sloppy mature code base. + 'minimum_severity' => 5, + + // A set of fully qualified class-names for which + // a call to parent::__construct() is required + 'parent_constructor_required' => [ + ], + +]; diff --git a/deepdiver1975/tarstreamer/.php-cs-fixer.dist.php b/deepdiver1975/tarstreamer/.php-cs-fixer.dist.php new file mode 100644 index 000000000..c12c70f53 --- /dev/null +++ b/deepdiver1975/tarstreamer/.php-cs-fixer.dist.php @@ -0,0 +1,13 @@ +setUsingCache(true) + ->getFinder() + ->in(__DIR__) + ->exclude('build') + ->exclude('vendor-bin') + ->exclude('vendor'); + +return $config; \ No newline at end of file diff --git a/deepdiver1975/tarstreamer/Makefile b/deepdiver1975/tarstreamer/Makefile new file mode 100644 index 000000000..74c572439 --- /dev/null +++ b/deepdiver1975/tarstreamer/Makefile @@ -0,0 +1,92 @@ +SHELL := /bin/bash + +COMPOSER_BIN := $(shell command -v composer 2> /dev/null) + +# bin file definitions +PHPUNIT=php -d zend.enable_gc=0 vendor/bin/phpunit +PHPUNITDBG=phpdbg -qrr -d memory_limit=4096M -d zend.enable_gc=0 vendor/bin/phpunit +PHP_CS_FIXER=php -d zend.enable_gc=0 vendor-bin/owncloud-codestyle/vendor/bin/php-cs-fixer +PHAN=php -d zend.enable_gc=0 vendor-bin/phan/vendor/bin/phan +PHPSTAN=php -d zend.enable_gc=0 vendor-bin/phpstan/vendor/bin/phpstan + +.PHONY: clean +clean: clean-deps + +# Installs and updates the composer dependencies. +.PHONY: composer +composer: + composer install --prefer-dist + composer update --prefer-dist + +##------------ +## Tests +##------------ + +.PHONY: test-php-unit +test-php-unit: ## Run php unit tests +test-php-unit: vendor/bin/phpunit + $(PHPUNIT) --configuration ./phpunit.xml --testsuite TarStreamer + +.PHONY: test-php-unit-dbg +test-php-unit-dbg: ## Run php unit tests using phpdbg +test-php-unit-dbg: vendor/bin/phpunit + $(PHPUNITDBG) --configuration ./phpunit.xml --testsuite TarStreamer + +.PHONY: test-php-style +test-php-style: ## Run php-cs-fixer and check owncloud code-style +test-php-style: vendor-bin/owncloud-codestyle/vendor + $(PHP_CS_FIXER) fix -v --diff --allow-risky yes --dry-run + +.PHONY: test-php-style-fix +test-php-style-fix: ## Run php-cs-fixer and fix code style issues +test-php-style-fix: vendor-bin/owncloud-codestyle/vendor + $(PHP_CS_FIXER) fix -v --diff --allow-risky yes + +.PHONY: test-php-phan +test-php-phan: ## Run phan +test-php-phan: vendor-bin/phan/vendor + $(PHAN) --config-file .phan/config.php --require-config-exists + +.PHONY: test-php-phpstan +test-php-phpstan: ## Run phpstan +test-php-phpstan: vendor-bin/phpstan/vendor + $(PHPSTAN) analyse --memory-limit=4G --configuration=./phpstan.neon --no-progress --level=5 src + +.PHONY: clean-deps +clean-deps: + rm -rf ./vendor + rm -Rf vendor-bin/**/vendor vendor-bin/**/composer.lock + +# +# Dependency management +#-------------------------------------- + +composer.lock: composer.json + @echo composer.lock is not up to date. + +vendor: composer.lock + composer install --no-dev + +vendor/bin/phpunit: composer.lock + composer install + +vendor/bamarni/composer-bin-plugin: composer.lock + composer install + +vendor-bin/owncloud-codestyle/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/owncloud-codestyle/composer.lock + composer bin owncloud-codestyle install --no-progress + +vendor-bin/owncloud-codestyle/composer.lock: vendor-bin/owncloud-codestyle/composer.json + @echo owncloud-codestyle composer.lock is not up to date. + +vendor-bin/phan/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/phan/composer.lock + composer bin phan install --no-progress + +vendor-bin/phan/composer.lock: vendor-bin/phan/composer.json + @echo phan composer.lock is not up to date. + +vendor-bin/phpstan/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/phpstan/composer.lock + composer bin phpstan install --no-progress + +vendor-bin/phpstan/composer.lock: vendor-bin/phpstan/composer.json + @echo phpstan composer.lock is not up to date. diff --git a/deepdiver1975/tarstreamer/src/TarHeader.php b/deepdiver1975/tarstreamer/src/TarHeader.php index ad6999b66..b8ff15da6 100644 --- a/deepdiver1975/tarstreamer/src/TarHeader.php +++ b/deepdiver1975/tarstreamer/src/TarHeader.php @@ -14,9 +14,7 @@ class TarHeader { private $size; private $mtime = ''; - - private $checksum; - + private $typeflag; private $linkname = ''; @@ -37,39 +35,39 @@ class TarHeader { private $reserved = ''; - public function setName($name){ + public function setName($name) { $this->name = $name; return $this; } - public function setSize($size){ + public function setSize($size) { $this->size = $size; return $this; } - public function setMtime($mtime){ + public function setMtime($mtime) { $this->mtime = $mtime; return $this; } - public function setTypeflag($typeflag){ + public function setTypeflag($typeflag) { $this->typeflag = $typeflag; return $this; } - public function setPrefix($prefix){ + public function setPrefix($prefix) { $this->prefix = $prefix; return $this; } - public function getHeader(){ + public function getHeader() { $fields = [ ['a100', substr($this->name, 0, 100)], ['a8', str_pad($this->mode, 7, '0', STR_PAD_LEFT)], - ['a8', decoct(str_pad($this->uid, 7, '0', STR_PAD_LEFT))], - ['a8', decoct(str_pad($this->gid, 7, '0', STR_PAD_LEFT))], - ['a12', str_pad(decoct($this->size), 11, '0', STR_PAD_LEFT)], - ['a12', str_pad(decoct($this->mtime), 11, '0', STR_PAD_LEFT)], + ['a8', decoct((int) str_pad($this->uid, 7, '0', STR_PAD_LEFT))], + ['a8', decoct((int) str_pad($this->gid, 7, '0', STR_PAD_LEFT))], + ['a12', str_pad(decoct((int)$this->size), 11, '0', STR_PAD_LEFT)], + ['a12', str_pad(decoct((int)$this->mtime), 11, '0', STR_PAD_LEFT)], // We calculate checksum later ['a8', ''], ['a1', $this->typeflag], @@ -89,11 +87,11 @@ public function getHeader(){ // Compute header checksum $checksum = str_pad(decoct($this->computeUnsignedChecksum($header)), 6, "0", STR_PAD_LEFT); - for ($i = 0; $i < 6; $i++){ + for ($i = 0; $i < 6; $i++) { $header[(148 + $i)] = substr($checksum, $i, 1); } - $header[154] = chr(0); - $header[155] = chr(32); + $header[154] = \chr(0); + $header[155] = \chr(32); return $header; } @@ -104,11 +102,11 @@ public function getHeader(){ * @param array $fields key being the format string and value being the data to pack * @return string binary packed data returned from pack() */ - protected function packFields($fields){ - list ($fmt, $args) = ['', []]; + protected function packFields($fields) { + list($fmt, $args) = ['', []]; // populate format string and argument list - foreach ($fields as $field){ + foreach ($fields as $field) { $fmt .= $field[0]; $args[] = $field[1]; } @@ -117,24 +115,24 @@ protected function packFields($fields){ array_unshift($args, $fmt); // build output string from header and compressed data - return call_user_func_array('pack', $args); + return \call_user_func_array('pack', $args); } /** * Generate unsigned checksum of header * * @param string $header - * @return string unsigned checksum + * @return float|int unsigned checksum */ - protected function computeUnsignedChecksum($header){ + protected function computeUnsignedChecksum($header) { $unsignedChecksum = 0; - for ($i = 0; $i < 512; $i++){ - $unsignedChecksum += ord($header[$i]); + for ($i = 0; $i < 512; $i++) { + $unsignedChecksum += \ord($header[$i]); } - for ($i = 0; $i < 8; $i++){ - $unsignedChecksum -= ord($header[148 + $i]); + for ($i = 0; $i < 8; $i++) { + $unsignedChecksum -= \ord($header[148 + $i]); } - $unsignedChecksum += ord(" ") * 8; + $unsignedChecksum += \ord(" ") * 8; return $unsignedChecksum; } diff --git a/deepdiver1975/tarstreamer/src/TarStreamer.php b/deepdiver1975/tarstreamer/src/TarStreamer.php index 5ee76756a..8bbf54a34 100644 --- a/deepdiver1975/tarstreamer/src/TarStreamer.php +++ b/deepdiver1975/tarstreamer/src/TarStreamer.php @@ -5,11 +5,10 @@ use ownCloud\TarStreamer\TarHeader; class TarStreamer { - - const REGTYPE = 0; - const DIRTYPE = 5; - const XHDTYPE = 'x'; - const LONGNAMETYPE = 'L'; + public const REGTYPE = 0; + public const DIRTYPE = 5; + public const XHDTYPE = 'x'; + public const LONGNAMETYPE = 'L'; /** * Process in 1 MB chunks @@ -24,13 +23,13 @@ class TarStreamer { * * @param array $options */ - public function __construct($options = []){ - if (isset($options['outstream'])){ + public function __construct($options = []) { + if (isset($options['outstream'])) { $this->outStream = $options['outstream']; } else { $this->outStream = fopen('php://output', 'w'); // turn off output buffering - while (ob_get_level() > 0){ + while (ob_get_level() > 0) { ob_end_flush(); } } @@ -49,13 +48,13 @@ public function __construct($options = []){ * @param string $contentType Content mime type to be set (optional, default 'application/x-tar') * @throws \Exception */ - public function sendHeaders($archiveName = 'archive.tar', $contentType = 'application/x-tar'){ + public function sendHeaders($archiveName = 'archive.tar', $contentType = 'application/x-tar') { $encodedArchiveName = rawurlencode($archiveName); - if (headers_sent($headerFile, $headerLine)){ + if (headers_sent($headerFile, $headerLine)) { throw new \Exception("Unable to send file $encodedArchiveName. HTML Headers have already been sent from $headerFile in line $headerLine"); } $buffer = ob_get_contents(); - if (!empty($buffer)){ + if (!empty($buffer)) { throw new \Exception("Unable to send file $encodedArchiveName. Output buffer already contains text (typically warnings or errors)."); } @@ -71,14 +70,14 @@ public function sendHeaders($archiveName = 'archive.tar', $contentType = 'applic ]; // Use UTF-8 filenames when not using Internet Explorer - if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') > 0) { + if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') > 0) { header('Content-Disposition: attachment; filename="' . rawurlencode($archiveName) . '"'); - } else { + } else { header('Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($archiveName) . '; filename="' . rawurlencode($archiveName) . '"'); } - foreach ($headers as $key => $value){ + foreach ($headers as $key => $value) { header("$key: $value"); } } @@ -94,15 +93,15 @@ public function sendHeaders($archiveName = 'archive.tar', $contentType = 'applic * * int timestamp: timestamp for the file (default: current time) * @return bool $success */ - public function addFileFromStream($stream, $filePath, $size, $options = []){ - if (!is_resource($stream) || get_resource_type($stream) != 'stream'){ + public function addFileFromStream($stream, $filePath, $size, $options = []) { + if (!\is_resource($stream) || get_resource_type($stream) != 'stream') { return false; } $this->initFileStreamTransfer($filePath, self::REGTYPE, $size, $options); // send file blocks - while ($data = fread($stream, $this->blockSize)){ + while ($data = fread($stream, $this->blockSize)) { // send data $this->streamFilePart($data); } @@ -117,12 +116,12 @@ public function addFileFromStream($stream, $filePath, $size, $options = []){ * Explicitly adds a directory to the tar (necessary for empty directories) * * @param string $name Name (path) of the directory - * @param array $opt Additional options to set + * @param array $opt Additional options to set * Valid options are: * * int timestamp: timestamp for the file (default: current time) * @return void */ - public function addEmptyDir($name, $opt = []){ + public function addEmptyDir($name, $opt = []) { $opt['type'] = self::DIRTYPE; // send header @@ -137,7 +136,7 @@ public function addEmptyDir($name, $opt = []){ * A closed archive can no longer have new files added to it. After * closing, the file is completely written to the output stream. * @return bool $success */ - public function finalize(){ + public function finalize() { // tar requires the end of the file have two 512 byte null blocks $this->send(pack('a1024', '')); @@ -150,19 +149,18 @@ public function finalize(){ * Initialize a file stream * * @param string $name file path or just name - * @param int $type type of the item + * @param int|string $type type of the item * @param int $size size in bytes of the file * @param array $opt array (optional) * Valid options are: * * int timestamp: timestamp for the file (default: current time) */ - protected function initFileStreamTransfer($name, $type, $size, $opt = []){ - $dirName = (dirname($name) == '.') ? '' : dirname($name); + protected function initFileStreamTransfer($name, $type, $size, $opt = []) { + $dirName = (\dirname($name) == '.') ? '' : \dirname($name); $fileName = ($type == self::DIRTYPE) ? basename($name) . '/' : basename($name); - // handle long file names - if (strlen($fileName) > 99 || strlen($dirName) > 154){ + if (\strlen($fileName) > 99 || \strlen($dirName) > 154) { $this->writeLongName($fileName, $dirName); } @@ -176,29 +174,29 @@ protected function initFileStreamTransfer($name, $type, $size, $opt = []){ ->setTypeflag($type) ->setPrefix($dirName) ->getHeader() - ; + ; // print header $this->send($header); } - protected function writeLongName($fileName, $dirName){ + protected function writeLongName($fileName, $dirName) { $internalPath = trim($dirName . '/' . $fileName, '/'); if ($this->longNameHeaderType === self::XHDTYPE) { // Long names via PAX $pax = $this->paxGenerate([ 'path' => $internalPath]); - $paxSize = strlen($pax); + $paxSize = \strlen($pax); $this->initFileStreamTransfer('', self::XHDTYPE, $paxSize); $this->streamFilePart($pax); $this->completeFileStream($paxSize); } else { // long names via 'L' header - $pathSize = strlen($internalPath); + $pathSize = \strlen($internalPath); $tarHeader = new TarHeader(); $header = $tarHeader->setName('././@LongLink') ->setSize($pathSize) ->setTypeflag(self::LONGNAMETYPE) ->getHeader() - ; + ; $this->send($header); $this->streamFilePart($internalPath); $this->completeFileStream($pathSize); @@ -210,7 +208,7 @@ protected function writeLongName($fileName, $dirName){ * * @param string $data raw data to send */ - protected function streamFilePart($data){ + protected function streamFilePart($data) { // send data $this->send($data); @@ -222,9 +220,9 @@ protected function streamFilePart($data){ * Complete the current file stream * @param $size */ - protected function completeFileStream($size){ + protected function completeFileStream($size) { // ensure we pad the last block so that it is 512 bytes - if (($mod = ($size % 512)) > 0){ + if (($mod = ($size % 512)) > 0) { $this->send(pack('a' . (512 - $mod), '')); } @@ -237,8 +235,8 @@ protected function completeFileStream($size){ * * @param string $data data to send */ - protected function send($data){ - if ($this->needHeaders){ + protected function send($data) { + if ($this->needHeaders) { $this->sendHeaders(); } $this->needHeaders = false; @@ -250,15 +248,15 @@ protected function send($data){ * Generate a PAX string * * @param array $fields key value mapping - * @return string PAX formated string + * @return string PAX formatted string * @link http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5&manpath=FreeBSD+8-current tar / PAX spec */ - protected function paxGenerate($fields){ + protected function paxGenerate($fields) { $lines = ''; - foreach ($fields as $name => $value){ + foreach ($fields as $name => $value) { // build the line and the size $line = ' ' . $name . '=' . $value . "\n"; - $size = strlen(strlen($line)) + strlen($line); + $size = \strlen((string) \strlen($line)) + \strlen($line); // add the line $lines .= $size . $line;