composer/composer · error · RuntimeException
The .fslckout file is missing from {path}, see https://getco
Error message
The .fslckout file is missing from {path}, see https://getcomposer.org/commit-deps for more information What it means
FossilDownloader::doUpdate() checks hasMetadataRepository() (presence of .fslckout or _FOSSIL_) and throws this RuntimeException if neither file exists in the package path. Without the checkout metadata, Fossil cannot perform an incremental update, so the operation aborts and points to commit-deps guidance.
Source
Thrown at src/Composer/Downloader/FossilDownloader.php:64
$this->execute(['fossil', 'clone', '--', $url, $repoFile]);
$this->execute(['fossil', 'open', '--nested', '--', $repoFile], $realPath);
$this->execute(['fossil', 'update', '--', (string) $package->getSourceReference()], $realPath);
return \React\Promise\resolve(null);
}
/**
* @inheritDoc
*/
protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url): PromiseInterface
{
// Ensure we are allowed to use this URL by config
$this->config->prohibitUrlByConfig($url, $this->io);
$this->io->writeError(" Updating to ".$target->getSourceReference());
if (!$this->hasMetadataRepository($path)) {
throw new RuntimeException('The .fslckout file is missing from '.$path.', see https://getcomposer.org/commit-deps for more information');
}
$realPath = Platform::realpath($path);
$this->execute(['fossil', 'pull'], $realPath);
$this->execute(['fossil', 'up', '--', (string) $target->getSourceReference()], $realPath);
return \React\Promise\resolve(null);
}
/**
* @inheritDoc
*/
public function getLocalChanges(PackageInterface $package, string $path): ?string
{
if (!$this->hasMetadataRepository($path)) {
return null;
}
View on GitHub (pinned to 6ffc117740)
Solutions
- Remove the affected package directory and re-run `composer install` to re-create a proper Fossil checkout.
- Stop deleting .fslckout/_FOSSIL_ files in any post-install cleanup hook.
- Run `composer clearcache` then reinstall if the working copy is corrupt.
Example fix
# before rm -rf vendor/foo/bar/.fslckout # cleanup removed metadata composer update foo/bar # after rm -rf vendor/foo/bar composer install
Defensive patterns
Strategy: validation
Validate before calling
if (!is_file($path . '/.fslckout') && !is_file($path . '/_FOSSIL_')) { throw new \RuntimeException('Fossil metadata missing at: ' . $path); } Type guard
function hasFossilMetadata(string $path): bool { return is_file($path . '/.fslckout') || is_file($path . '/_FOSSIL_'); } Prevention
- Do not strip .fslckout/_FOSSIL_ files in cleanup hooks.
- If a Fossil checkout is corrupt, delete the whole package dir and reinstall.
- Verify VCS metadata is preserved by custom installers.
When it happens
Trigger: Updating a package sourced from a Fossil repository when the working copy at the path is missing its .fslckout/_FOSSIL_ metadata file - e.g. the directory was partially wiped, a custom installer removed metadata, or the initial checkout failed silently.
Common situations: Custom installers/cleaners that delete VCS metadata; interrupted prior install leaving a half-populated directory; switching download strategies without clearing vendor; disk cleanup tools removing hidden files.
Related errors
- The .git directory is missing from {path}, see https://getco
- Failed to execute {command} {errorOutput}
- Installing {package} would lead to overwriting the {to}/{fil
- {base} could not be saved to {fileName}, make sure the direc
- Could not completely delete {path}, aborting.
AI-assisted analysis of composer/composer@6ffc117740 (2026-08-07).
Data as JSON: /api/errors/5c25835cc1437dc2.
Report an issue: GitHub.