{"record":{"id":"5c25835cc1437dc2","repo":"composer/composer","slug":"the-fslckout-file-is-missing-from-path-see-htt","errorCode":null,"errorMessage":"The .fslckout file is missing from {path}, see https://getcomposer.org/commit-deps for more information","messagePattern":"The \\.fslckout file is missing from (.+?), see https://getcomposer\\.org/commit-deps for more information","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/Composer/Downloader/FossilDownloader.php","lineNumber":64,"sourceCode":"        $this->execute(['fossil', 'clone', '--', $url, $repoFile]);\n        $this->execute(['fossil', 'open', '--nested', '--', $repoFile], $realPath);\n        $this->execute(['fossil', 'update', '--', (string) $package->getSourceReference()], $realPath);\n\n        return \\React\\Promise\\resolve(null);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url): PromiseInterface\n    {\n        // Ensure we are allowed to use this URL by config\n        $this->config->prohibitUrlByConfig($url, $this->io);\n\n        $this->io->writeError(\" Updating to \".$target->getSourceReference());\n\n        if (!$this->hasMetadataRepository($path)) {\n            throw new RuntimeException('The .fslckout file is missing from '.$path.', see https://getcomposer.org/commit-deps for more information');\n        }\n\n        $realPath = Platform::realpath($path);\n        $this->execute(['fossil', 'pull'], $realPath);\n        $this->execute(['fossil', 'up', '--', (string) $target->getSourceReference()], $realPath);\n\n        return \\React\\Promise\\resolve(null);\n    }\n\n    /**\n     * @inheritDoc\n     */\n    public function getLocalChanges(PackageInterface $package, string $path): ?string\n    {\n        if (!$this->hasMetadataRepository($path)) {\n            return null;\n        }\n","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/composer/composer/blob/c435d285c9120efdca35696769c72ea9fdcc0466/src/Composer/Downloader/FossilDownloader.php#L46-L82","documentation":"Thrown by FossilDownloader::doUpdate() when the target package directory does not contain a Fossil SCM checkout. The code at FossilDownloader.php:63-64 calls hasMetadataRepository($path), which checks for the presence of $path/.fslckout or $path/_FOSSIL_ (line 126). If neither file exists, a RuntimeException is thrown. This means Composer expected a Fossil-managed working directory but found none, indicating the package was not installed via Fossil clone.","triggerScenarios":"Updating a package whose source type is 'fossil' but whose install directory lacks Fossil metadata files. This happens when the directory was created by a different downloader, manually emptied, or the checkout was partially deleted.","commonSituations":"A dependency using type:fossil where the checkout was corrupted or the .fslckout file was deleted (e.g. by .gitignore cleanup or a build process that strips dotfiles). Switching source types. Filesystem cleanup tools removing metadata files.","solutions":["Delete the package directory and re-run 'composer install' to force a fresh Fossil clone.","Verify the 'fossil' binary is installed and on PATH: 'which fossil'.","Check that no build step or .gitignore rule is removing the .fslckout or _FOSSIL_ files.","Ensure the package's source type in composer.json or the remote repository is correctly set to 'fossil'."],"exampleFix":"# before\n$ composer update vendor/fossil-pkg\n# RuntimeException: The .fslckout file is missing from ...\n\n# after: force reinstall\n$ rm -rf vendor/vendor/fossil-pkg\n$ composer install","handlingStrategy":"validation","validationCode":"// Verify Fossil metadata before update\n$path = 'vendor/' . $package->getName();\nif (!is_file($path . '/.fslckout') && !is_file($path . '/_FOSSIL_')) {\n    // Re-clone by removing the directory\n    \\Composer\\Util\\Filesystem::removeDirectory($path);\n}","typeGuard":"function hasFossilMetadata(string $path): bool {\n    return is_file($path . '/.fslckout') || is_file($path . '/_FOSSIL_');\n}","tryCatchPattern":"try {\n    $downloader->update($initial, $target, $path, $url);\n} catch (\\RuntimeException $e) {\n    if (str_contains($e->getMessage(), '.fslckout file is missing')) {\n        // Remove the path and re-install to get a fresh checkout\n        \\Composer\\Util\\Filesystem::removeDirectory($path);\n        $downloader->install($target, $path, $url);\n    }\n    throw $e;\n}","preventionTips":["Ensure no build step or .gitignore rule removes .fslckout or _FOSSIL_ files.","Verify the 'fossil' binary is installed and on PATH.","Delete and re-clone the package directory if metadata is corrupted."],"tags":["fossil","vcs","downloader","filesystem","checkout"],"backgroundTag":null,"analyzedSha":"c435d285c9120efdca35696769c72ea9fdcc0466","analyzedAt":"2026-08-07T18:58:23.525Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}