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

  1. Remove the affected package directory and re-run `composer install` to re-create a proper Fossil checkout.
  2. Stop deleting .fslckout/_FOSSIL_ files in any post-install cleanup hook.
  3. 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

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


AI-assisted analysis of composer/composer@6ffc117740 (2026-08-07). Data as JSON: /api/errors/5c25835cc1437dc2. Report an issue: GitHub.