def verify(state): """Verify the hash in Pipfile.lock is up-to-date.""" if not state.project.pipfile_exists: echo("No Pipfile present at project home.", err=True) sys.exit(1) if state.project.get_lockfile_hash( ) != state.project.calculate_pipfile_hash(): echo( "Pipfile.lock is out-of-date. Run {} to update.".format( crayons.yellow("$ pipenv lock", bold=True)), err=True, ) sys.exit(1) echo(crayons.green("Pipfile.lock is up-to-date.")) sys.exit(0)
def shell( state, fancy=False, shell_args=None, anyway=False, ): """Spawns a shell within the virtualenv.""" from ..core import do_shell, load_dot_env # Prevent user from activating nested environments. if "PIPENV_ACTIVE" in os.environ: # If PIPENV_ACTIVE is set, VIRTUAL_ENV should always be set too. venv_name = os.environ.get("VIRTUAL_ENV", "UNKNOWN_VIRTUAL_ENVIRONMENT") if not anyway: echo( "{} {} {}\nNo action taken to avoid nested environments.". format( crayons.normal("Shell for"), crayons.green(venv_name, bold=True), crayons.normal("already activated.", bold=True), ), err=True, ) sys.exit(1) # Load .env file. load_dot_env(state.project) # Use fancy mode for Windows. if os.name == "nt": fancy = True do_shell( state.project, three=state.three, python=state.python, fancy=fancy, shell_args=shell_args, pypi_mirror=state.pypi_mirror, )
def cli( ctx, state, where=False, venv=False, py=False, envs=False, rm=False, bare=False, man=False, support=None, help=False, site_packages=None, **kwargs, ): from pipenv.utils.spinner import create_spinner from ..core import ( cleanup_virtualenv, do_clear, do_py, do_where, ensure_project, format_help, system_which, warn_in_virtualenv, ) if man: if system_which("man"): path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "pipenv.1") os.execle(system_which("man"), "man", path, os.environ) return 0 else: secho( "man does not appear to be available on your system.", fg="yellow", bold=True, err=True, ) return 1 if envs: echo( "The following environment variables can be set, to do various things:\n" ) for key in state.project.__dict__: if key.startswith("PIPENV"): echo(f" - {crayons.normal(key, bold=True)}") echo("\nYou can learn more at:\n {}".format( crayons.green( "https://pipenv.pypa.io/en/latest/advanced/#configuration-with-environment-variables" ))) return 0 warn_in_virtualenv(state.project) if ctx.invoked_subcommand is None: # --where was passed... if where: do_where(state.project, bare=True) return 0 elif py: do_py(state.project, ctx=ctx) return 0 # --support was passed... elif support: from ..help import get_pipenv_diagnostics get_pipenv_diagnostics(state.project) return 0 # --clear was passed... elif state.clear: do_clear(state.project) return 0 # --venv was passed... elif venv: # There is no virtualenv yet. if not state.project.virtualenv_exists: echo( "{}({}){}".format( crayons.red( "No virtualenv has been created for this project"), crayons.normal(state.project.project_directory, bold=True), crayons.red(" yet!"), ), err=True, ) ctx.abort() else: echo(state.project.virtualenv_location) return 0 # --rm was passed... elif rm: # Abort if --system (or running in a virtualenv). if state.project.s.PIPENV_USE_SYSTEM or environments.is_in_virtualenv( ): echo( crayons.red( "You are attempting to remove a virtualenv that " "Pipenv did not create. Aborting.")) ctx.abort() if state.project.virtualenv_exists: loc = state.project.virtualenv_location echo( crayons.normal("{} ({})...".format( crayons.normal("Removing virtualenv", bold=True), crayons.green(loc), ))) with create_spinner(text="Running...", setting=state.project.s): # Remove the virtualenv. cleanup_virtualenv(state.project, bare=True) return 0 else: echo( crayons.red( "No virtualenv has been created for this project yet!", bold=True, ), err=True, ) ctx.abort() # --python or --three was passed... if (state.python or state.three is not None) or state.site_packages: ensure_project( state.project, three=state.three, python=state.python, warn=True, site_packages=state.site_packages, pypi_mirror=state.pypi_mirror, clear=state.clear, ) # Check this again before exiting for empty ``pipenv`` command. elif ctx.invoked_subcommand is None: # Display help to user, if no commands were passed. echo(format_help(ctx.get_help()))
def update(ctx, state, bare=False, dry_run=None, outdated=False, **kwargs): """Runs lock, then sync.""" from ..core import do_lock, do_outdated, do_sync, ensure_project ensure_project( state.project, three=state.three, python=state.python, pypi_mirror=state.pypi_mirror, warn=(not state.quiet), site_packages=state.site_packages, clear=state.clear, ) if not outdated: outdated = bool(dry_run) if outdated: do_outdated( state.project, clear=state.clear, pre=state.installstate.pre, pypi_mirror=state.pypi_mirror, ) packages = [p for p in state.installstate.packages if p] editable = [p for p in state.installstate.editables if p] if not packages: echo("{} {} {} {}{}".format( crayons.normal("Running", bold=True), crayons.yellow("$ pipenv lock", bold=True), crayons.normal("then", bold=True), crayons.yellow("$ pipenv sync", bold=True), crayons.normal(".", bold=True), )) else: for package in packages + editable: if package not in state.project.all_packages: echo( "{}: {} was not found in your Pipfile! Aborting." "".format( crayons.red("Warning", bold=True), crayons.green(package, bold=True), ), err=True, ) ctx.abort() do_lock( state.project, ctx=ctx, clear=state.clear, pre=state.installstate.pre, keep_outdated=state.installstate.keep_outdated, pypi_mirror=state.pypi_mirror, write=not state.quiet, ) do_sync( state.project, dev=state.installstate.dev, three=state.three, python=state.python, bare=bare, dont_upgrade=not state.installstate.keep_outdated, user=False, clear=state.clear, unused=False, sequential=state.installstate.sequential, pypi_mirror=state.pypi_mirror, )