{"id":"72b31565257eb345","repo":"pypa/pip","slug":"please-provide-a-pattern","errorCode":null,"errorMessage":"Please provide a pattern","messagePattern":"Please provide a pattern","errorType":"exception","errorClass":"CommandError","httpStatus":null,"severity":"error","filePath":"src/pip/_internal/commands/cache.py","lineNumber":170,"sourceCode":"\n        results = []\n        for filename in files:\n            wheel = os.path.basename(filename)\n            size = filesystem.format_file_size(filename)\n            results.append(f\" - {wheel} ({size})\")\n        logger.info(\"Cache contents:\\n\")\n        logger.info(\"\\n\".join(sorted(results)))\n\n    def format_for_abspath(self, files: list[str]) -> None:\n        if files:\n            logger.info(\"\\n\".join(sorted(files)))\n\n    def remove_cache_items(self, options: Values, args: list[str]) -> None:\n        if len(args) > 1:\n            raise CommandError(\"Too many arguments\")\n\n        if not args:\n            raise CommandError(\"Please provide a pattern\")\n\n        files = self._find_wheels(options, args[0])\n\n        no_matching_msg = \"No matching packages\"\n        if args[0] == \"*\":\n            # Only fetch http files if no specific pattern given\n            files += self._find_http_files(options)\n        else:\n            # Add the pattern to the log message\n            no_matching_msg += f' for pattern \"{args[0]}\"'\n\n        if not files:\n            logger.warning(no_matching_msg)\n\n        bytes_removed = 0\n        for filename in files:\n            bytes_removed += os.stat(filename).st_size\n            os.unlink(filename)","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/pypa/pip/blob/d7d0d0a39494e28ec1c407bd0680e4a4d1067791/src/pip/_internal/commands/cache.py#L152-L188","documentation":"Raised by 'pip cache remove' (CacheCommand.remove_cache_items) when no pattern argument is supplied. Unlike list (which defaults to '*'), remove requires an explicit pattern so that users do not accidentally wipe the whole cache. The check at cache.py:169 fires when args is empty.","triggerScenarios":"Running bare 'pip cache remove' with no pattern. The branch is reached right after the 'too many arguments' check passes.","commonSituations":"Forgetting the package name; intending 'remove everything' (use 'pip cache purge' instead); a variable that expanded to empty.","solutions":["Provide a package name or glob: 'pip cache remove numpy' or 'pip cache remove \"numpy*\"'.","To delete the entire cache, use 'pip cache purge'.","Assert your pattern variable is non-empty before invoking remove."],"exampleFix":"// before\npip cache remove\n// after\npip cache purge","handlingStrategy":"validation","validationCode":"if not pattern:\n    raise SystemExit(\"'pip cache remove' needs a pattern; to wipe everything use 'pip cache purge'\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat bare 'pip cache remove' as a bug - require an explicit pattern in scripts.","Use 'pip cache purge' when you mean everything."],"tags":["pip","cache","cli","missing-argument","destructive-op"],"analyzedSha":"d7d0d0a39494e28ec1c407bd0680e4a4d1067791","analyzedAt":"2026-08-04T20:55:04.259Z","schemaVersion":2}