php-tuf/composer-stager
Stages Composer commands so they can be safely run on a production codebase.
v2.1.1
6.2M downloads/mo
#826 most downloaded on Packagist
php-tuf/composer-stager
What this package is like to depend on
Last release 1 months ago
07 Jul 2026
Release timing varies
gaps range from 8 days to 7 months
Some releases are documented
notes for 5 of 18 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
36 releases · first in 2021
3 releases in the last 12 months
see the full history below
Release timeline
36 releases · Jun 2021 to Jul 2026Releases
latest 36-
v2.1.107 Jul 2026Release notes
Open source →What's Changed
Other Changes
- Use Docker for local testing with multiple versions of dependencies by @TravisCarden in #444
- Fix compatibility with
symfony/filesystem>=v6.4.40/v7.4.11 by @TravisCarden in #446
Full Changelog: v2.1.0...v2.1.1
-
v2.1.004 Feb 2026Release notes
Open source →What's Changed
New Features
Other Changes
- Bump
phpunit/phpunitfrom 10.5.46 to 10.5.63 by @TravisCarden in #437
New Contributors
Full Changelog: v2.0.2...v2.1.0
- Bump
-
v2.0.217 Nov 2025 -
v2.0.121 Apr 2025Release notes
Open source → -
v2.0.016 Dec 2024Release notes
Open source →What's Changed
New Features
- Add
Domain\Value\Path\PathInterface::isAbsolute()by @TravisCarden in #62 - Add an optional
$cwdargument toInfrastructure\Value\Path\AbstractPath::__construct()by @TravisCarden in #63 - Add
Domain\Value\Path\PathInterface::raw()by @TravisCarden in #64 - Add
Domain\Service\Host\HostInterfaceby @TravisCarden in #65 - Add an optional
$cwdargument toInfrastructure\Factory\Path\PathFactoryInterface::create()by @TravisCarden in #66 - Add the ability to
Domain\Service\Filesystem\FilesystemInterfaceto distinguish between hard links and symlinks by @TravisCarden in #69 - Forbid symlinks pointing to a directory with
PhpFileSyncerby @TravisCarden in #109 - Rename
PathInterface::resolve()and::resolveRelativeTo()by @TravisCarden in #114 - Explicitly mark the API surface by @TravisCarden in #115
- Make
Domain\Service\Host\HostInterface::isWindows()static by @TravisCarden in #119 - Merge
Domain\Aggregate\PreconditionsTree\PreconditionsTreeInterfaceintoDomain\Service\Precondition\PreconditionInterfaceby @TravisCarden in #127 - Add
Infrastructure\Service\Filesystem\Filesystem::isDirEmpty()by @TravisCarden in #155 - Make preconditions trees return the status message of the first unfulfilled child if there is one by @TravisCarden in #156
- Include "previous" exception details in thrown exception in
Filesystem::copy()by @TravisCarden in #191 - Add precondition for host support for running independent PHP processes by @TravisCarden in #192
- Use an "exceptions" domain for all translatable exception messages by @TravisCarden in #196
- Make translation domains overridable via service by @TravisCarden in #201
- Add placeholder substitution to
TranslatableMessage::__toString()by @TravisCarden in #203 - Eliminate dynamic properties for PHP 8.2 compatibility by @TravisCarden in #210
- Move most internal interfaces into the API by @TravisCarden in #211
- Hide Symfony Process component behind a facade by @TravisCarden in #216
- Introduce
API\Process\Value\OutputTypeEnumfor a saferAPI\Process\Service\OutputCallbackInterfaceby @TravisCarden in #221 - Add
API\Process\Service\ProcessInterface::run()by @TravisCarden in #222 - Add
API\Process\Service\ProcessInterface::setEnv()and::getEnv()by @TravisCarden in #224 - Make
API\Translation\Service\TranslatorInterfacean injectable service by @TravisCarden in #225 - Put Path\Value\PathList behind a factory by @TravisCarden in #239
- Rename
API\Path\Value\PathInterface::resolved()and::resolvedRelativeTo()to::absolute()and::relative(), respectively by @TravisCarden in #243 - Make
API\Path\Factory\PathFactoryInterface::create()non-static by @TravisCarden in #249 - Add path canonicalization to
PathListpaths by @TravisCarden in #240 - Add support for Windows directory separators to
Internal\FileSyncer\Service\RsyncFileSyncerby @TravisCarden in #250 - Merge
HostInterfaceintoEnvironmentInterfaceand move it into the API layer by @TravisCarden in #261 - Add
$timeoutargument to relevantAPI\Precondition\Service\PreconditionInterfacemethods by @TravisCarden in #266 - Downgrade Symfony components to support Drupal 10.0.x. by @TravisCarden in #269
- Document and add tests for expanded Drupal core supported versions spread by @TravisCarden in #272
- Add
API\Process\Service\ProcessInterface::getErrorOutput()by @TravisCarden in #273 - Inject
FileSyncerFactoryInterfaceinstead of depending onFileSyncerInterfacedirectly by @TravisCarden in #274 - Fix some untranslatable UI strings and add a PHPStan rule to prevent introducing any more by @TravisCarden in #285
- Add
API\Filesystem\Service\FilesystemInterface::filePerms()by @TravisCarden in #304 - Stop trying to convert
fileperms()result inInternal\Filesystem\Service\Filesystem::filePerms()by @TravisCarden in #306 - Add
API\Filesystem\Service\FilesystemInterface::chmod()by @TravisCarden in #303 - Replace
API\Filesystem\Service\FilesystemInterface::filePerms()with::fileMode()by @TravisCarden in #307 - Add
API\Filesystem\Service\FilesystemInterface::touch()by @TravisCarden in #319 - Add
$envargument toProcesscreation chain by @TravisCarden in #324 - Add
$cwdargument toProcesscreation chain by @TravisCarden in #325 - Add
API\Path\Value\PathInterface::isRelative()by @TravisCarden in #328 - Convert
PathHelperinto an injectable service by @TravisCarden in #329 - Remove
PhpFileSyncerand addrsyncsupport for Windows by @TravisCarden in #334 - Add support for symlinks that point to a directory by @TravisCarden in #336
- Make sure active and staging directories are actually directories by @TravisCarden in #341
- Add
API\Precondition\Service\NoNestingOnWindowsInterfaceby @TravisCarden in #342 - Make compatible with Symfony 7 by @TravisCarden in #351
- Add methods to
API\Process\Service\OutputCallbackInterfaceand create an implementation by @TravisCarden in #355 - Make
ComposerIsAvailableuseComposerProcessRunnerinstead ofProcessFactoryby @TravisCarden in #357 - Declare conflicts with vulnerable versions of
symfony/processby @TravisCarden in #395
Other Changes
- Add Composer dependency on ext-json by @TravisCarden in #53
- Make Infrastructure\Service\Precondition\ComposerIsAvailable confirm that found Composer executable is actually valid by @TravisCarden in #54
- Fix spelling in phpstan.neon.dist by @alexpott in #55
- Infrastructure\Service\Finder\ExecutableFinder incorrectly caches exception backtraces by @TravisCarden in #70
- Resolve #58: Add support for select symlink types by @TravisCarden in #61
- Resolve #74: Increase minimum PHP version to 8.1 by @TravisCarden in #91
- Fix some link-related preconditions assuming all links are symlinks by @TravisCarden in #100
- Generalize AbstractLinkIteratingPrecondition as AbstractFileIteratingPrecondition by @TravisCarden in #102
- Make Infrastructure\Service\FileSyncer\RsyncFileSyncer::sync() respect $timeout by @TravisCarden in #104
- Add Domain\Service\Filesystem\FilesystemInterface::isDir() and isFile() methods by @TravisCarden in #108
- Filesystem::readLink() resolves links relative to the PHP process' CWD instead of the link directory by @TravisCarden in #110
- Normalize exception codes at default values by @TravisCarden in #111
- Resolve #103: Make Infrastructure\Value\PathList\PathList::add() variadic. by @TravisCarden in #116
- Resolve #76: Add Domain\Aggregate\PreconditionsTree\ActiveDirIsReadyInterface by @TravisCarden in #117
- Minor observations from review by @larowlan in #118
- Move core domain classes up a namespace level by @TravisCarden in #128
- Fold
PathListpackage intoPathby @TravisCarden in #146 - Resolve #123: Add support for string translation for names, descriptions, and messages by @TravisCarden in #141
- Rename
RecursiveFileFinderInterfacetoFileFinderInterfaceby @TravisCarden in #181 - Reorganize directories: flip packages and DDD categories by @TravisCarden in #184
- Rename "Domain" and "Infrastructure" layers to "API" and "Internal", respectively by @TravisCarden in #185
- Rearrange classes between API/Internal layers by @TravisCarden in #190
- Make translation locales overridable via service by @TravisCarden in #208
- Move
ProcessRunnerInterface::DEFAULT_TIMEOUTtoProcessInterfaceby @TravisCarden in #218 - Add performance testing for preconditions and file syncers by @TravisCarden in #230
- Remove unused
API\Path\Value\PathInterface::raw()by @TravisCarden in #244 - Fix #172: Replace custom path-handling with Symfony Filesystem by @TravisCarden in #246
- Make
$timeoutarguments non-nullable by @TravisCarden in #254 - Degrade gracefully when
set_time_limit()is disabled by @TravisCarden in #256 - Add mutation testing by @TravisCarden in #277
- Add ComposerRequireChecker for transitive dependency detection by @TravisCarden in #278
- Add value deduplication to
Internal\Path\Value\PathList::getAll()by @TravisCarden in #279 - Make
API\Filesystem\Service\FilesystemInterface::copy()preserve file permissions by @TravisCarden in #308 - Rename
FilesystemInterface::exists()to::fileExists()by @TravisCarden in #314 - Remove
API\Filesystem\Service\FilesystemInterface::isDirEmpty()by @TravisCarden in #316 - Rename
Internal\Filesystem\Service\Filesystem::remove()to::rm()by @TravisCarden in #318 - Add tests for syncing permissions and empty directories by @TravisCarden in #337
- Add tests that the file syncer can copy a Git directory. by @TravisCarden in #338
- Remove now-unused methods on
API\Filesystem\Service\FilesystemInterfaceby @TravisCarden in #339 - Make
API\Filesystem\Service\FilesystemInterface::isDir()and::isFile()resolve links like their PHP built-in counterparts by @TravisCarden in #340 - Wire new preconditions up to
CommonPreconditionsby @TravisCarden in #345 - Stop returning
selffromAPI\Process\Service\ProcessInterfacemethods by @TravisCarden in #347 - Update tests to include PHP 8.3 on GitHub Actions by @TravisCarden in #352
- Make
FileSyncerskip files based on contents, not modification time and filesize by @TravisCarden in #365 - Fix process error output-capturing broken by upstream regression by @TravisCarden in #368
- Outright fork Symfony Process by @TravisCarden in #371
- Remove temporary Symfony Process fork by @TravisCarden in #374
- Add
SECURITY.mdby @TravisCarden in #85 - Add
GOVERNANCE.mdby @TravisCarden in #299 - Make
Internal\Precondition\Service\RsyncIsAvailablemore robust by @TravisCarden in #396 - Stop looking for a PHAR file version of Composer by @TravisCarden in #399
- Upgrade PHPUnit to 10.x by @TravisCarden in #400
- Remove uncommon dev dependencies by @TravisCarden in #401
- Add extra dev dependencies back as a separate "package" by @TravisCarden in #404
New Contributors
Full Changelog: v1.2.0...v2.0.0
- Add
-
v2.0.0-rc619 Nov 2024 pre-releaseRelease notes
Open source →What's Changed
- Add
SECURITY.mdby @TravisCarden in #85 - Add
GOVERNANCE.mdby @TravisCarden in #299 - Make
Internal\Precondition\Service\RsyncIsAvailablemore robust by @TravisCarden in #396 - Stop looking for a PHAR file version of Composer by @TravisCarden in #399
- Declare conflicts with vulnerable versions of
symfony/processby @TravisCarden in #395
Full Changelog: v2.0.0-rc5...v2.0.0-rc6
- Add
-
v2.0.0-rc517 Jul 2024 pre-releaseRelease notes
Open source →What's Changed
- Remove temporary Symfony Process fork by @TravisCarden in #374
Full Changelog: v2.0.0-rc4...v2.0.0-rc5
-
v2.0.0-rc414 Jun 2024 pre-releaseRelease notes
Open source →What's Changed
- Outright fork Symfony Process by @TravisCarden in #371
Full Changelog: v2.0.0-rc3...v2.0.0-rc4
-
v2.0.0-rc306 Jun 2024 pre-releaseRelease notes
Open source →What's Changed
- Fix process error output-capturing broken by upstream regression by @TravisCarden in #368
Full Changelog: v2.0.0-rc2...v2.0.0-rc3
-
v2.0.0-rc223 May 2024 pre-releaseRelease notes
Open source →What's Changed
- Make
FileSyncerskip files based on contents, not modification time and filesize by @TravisCarden in #365
Full Changelog: v2.0.0-rc1...v2.0.0-rc2
- Make
-
v2.0.0-rc117 Apr 2024 pre-releaseNothing published for this version
-
v2.0.0-beta503 Apr 2024 pre-releaseNothing published for this version
-
v2.0.0-beta414 Mar 2024 pre-releaseNothing published for this version
-
v2.0.0-beta330 Aug 2023 pre-releaseNothing published for this version
-
v2.0.0-beta210 Aug 2023 pre-releaseNothing published for this version
-
v2.0.0-beta128 Jul 2023 pre-releaseNothing published for this version
-
v2.0.0-alpha407 Jul 2023 pre-releaseNothing published for this version
-
v2.0.0-alpha305 Jul 2023 pre-releaseNothing published for this version
-
v2.0.0-alpha216 Jun 2023 pre-releaseNothing published for this version
-
v2.0.0-alpha117 Mar 2023 pre-releaseNothing published for this version
-
v1.2.116 Feb 2023Nothing published for this version
-
v1.2.025 Oct 2022Nothing published for this version
-
v1.1.015 Sep 2022Nothing published for this version
-
v1.0.021 Jul 2022Nothing published for this version
-
v1.0.0-rc108 Jul 2022 pre-releaseNothing published for this version
-
v1.0.0-beta229 Jun 2022 pre-releaseNothing published for this version
-
v1.0.0-beta110 Jun 2022 pre-releaseNothing published for this version
-
v0.5.010 May 2022Nothing published for this version
-
v0.4.026 Apr 2022Nothing published for this version
-
v0.3.015 Dec 2021Nothing published for this version
-
v0.2.315 Oct 2021Nothing published for this version
-
v0.2.222 Sep 2021Nothing published for this version
-
v0.2.114 Sep 2021Nothing published for this version
-
v0.2.027 Aug 2021Nothing published for this version
-
v0.1.111 Aug 2021Nothing published for this version
-
v0.1.030 Jun 2021Nothing published for this version