11import logging
22import os
33import subprocess
4- import sys
54import textwrap
65from pathlib import Path
76from typing import Optional
2625from cwmscli .utils .deps import requires
2726from cwmscli .utils .update import (
2827 build_update_package_spec ,
28+ get_update_environment ,
2929 launch_windows_update ,
30+ looks_like_externally_managed_environment ,
3031 looks_like_missing_version ,
3132)
3233from cwmscli .utils .version import get_cwms_cli_version
@@ -416,6 +417,7 @@ def csv2cwms_cmd(**kwargs):
416417def update_cli_cmd (target_version : Optional [str ], pre : bool , yes : bool ) -> None :
417418 current_version = get_cwms_cli_version ()
418419 package_spec = build_update_package_spec (target_version )
420+ update_environment = get_update_environment ()
419421
420422 click .echo (
421423 "Current cwms-cli version: " f"{ colors .c (current_version , 'cyan' , bright = True )} "
@@ -428,12 +430,35 @@ def update_cli_cmd(target_version: Optional[str], pre: bool, yes: bool) -> None:
428430 else :
429431 click .echo ("Requested cwms-cli version: latest available release" )
430432
431- cmd = [sys .executable , "-m" , "pip" , "install" , "--upgrade" , package_spec ]
433+ click .echo ("Update environment:" )
434+ click .echo (f" Python executable: { update_environment .python_executable } " )
435+ click .echo (
436+ f" Environment: { update_environment .environment_prefix } "
437+ f"({ update_environment .environment_type } )"
438+ )
439+ click .echo (f" Package metadata location: { update_environment .package_location } " )
440+ if update_environment .editable_project_location :
441+ click .echo (
442+ " Editable project location: "
443+ f"{ update_environment .editable_project_location } "
444+ )
445+
446+ cmd = [
447+ update_environment .python_executable ,
448+ "-m" ,
449+ "pip" ,
450+ "install" ,
451+ "--upgrade" ,
452+ package_spec ,
453+ ]
432454 if pre :
433455 cmd .append ("--pre" )
434456
435457 if not yes :
436- proceed = click .confirm ("Proceed with updating cwms-cli via pip?" , default = True )
458+ proceed = click .confirm (
459+ "Proceed with updating cwms-cli in this environment via pip?" ,
460+ default = True ,
461+ )
437462 if not proceed :
438463 click .echo (colors .warn ("Update canceled." ))
439464 return
@@ -472,6 +497,16 @@ def update_cli_cmd(target_version: Optional[str], pre: bool, yes: bool) -> None:
472497
473498 if result .returncode != 0 :
474499 pip_output = "\n " .join (part for part in [result .stdout , result .stderr ] if part )
500+ if looks_like_externally_managed_environment (pip_output ):
501+ raise click .ClickException (
502+ colors .err (
503+ "The selected Python installation is externally managed, so pip "
504+ "refused to update cwms-cli. Install cwms-cli in a virtual "
505+ "environment or with pipx, then run that installation's "
506+ "cwms-cli update command. cwms-cli will not use "
507+ "--break-system-packages automatically."
508+ )
509+ )
475510 if target_version and looks_like_missing_version (pip_output , package_spec ):
476511 raise click .ClickException (
477512 colors .err (
0 commit comments