Path: blob/main/test/lib/python3.9/site-packages/pip/_internal/commands/hash.py
4804 views
import hashlib1import logging2import sys3from optparse import Values4from typing import List56from pip._internal.cli.base_command import Command7from pip._internal.cli.status_codes import ERROR, SUCCESS8from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES9from pip._internal.utils.misc import read_chunks, write_output1011logger = logging.getLogger(__name__)121314class HashCommand(Command):15"""16Compute a hash of a local package archive.1718These can be used with --hash in a requirements file to do repeatable19installs.20"""2122usage = "%prog [options] <file> ..."23ignore_require_venv = True2425def add_options(self) -> None:26self.cmd_opts.add_option(27"-a",28"--algorithm",29dest="algorithm",30choices=STRONG_HASHES,31action="store",32default=FAVORITE_HASH,33help="The hash algorithm to use: one of {}".format(34", ".join(STRONG_HASHES)35),36)37self.parser.insert_option_group(0, self.cmd_opts)3839def run(self, options: Values, args: List[str]) -> int:40if not args:41self.parser.print_usage(sys.stderr)42return ERROR4344algorithm = options.algorithm45for path in args:46write_output(47"%s:\n--hash=%s:%s", path, algorithm, _hash_of_file(path, algorithm)48)49return SUCCESS505152def _hash_of_file(path: str, algorithm: str) -> str:53"""Return the hash digest of a file."""54with open(path, "rb") as archive:55hash = hashlib.new(algorithm)56for chunk in read_chunks(archive):57hash.update(chunk)58return hash.hexdigest()596061