Skip to content

Commit

Permalink
Add new "env update" command (#388)
Browse files Browse the repository at this point in the history
This has options to update python in the venv as well as the packages from the requirements files.

Examples:

 gactar env update --python
 gactar env update --pip
 gactar env update --all --dev

Part of #22
  • Loading branch information
asmaloney authored Aug 25, 2023
1 parent 4c5398c commit ebc04a6
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 9 deletions.
16 changes: 14 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
GIT_COMMIT=$(shell git describe --always)

.PHONY: all build clean test
.PHONY: all build clean test install-venv update-venv

default: build

Expand All @@ -13,4 +13,16 @@ clean:
rm ./gactar

test:
go test ./...
go test ./...

####
# The following are convenience targets for managing the virtual environment

# Create the gactar venv (with dev packages)
install-venv:
./gactar env setup --dev

# Update the python version in the venv and
# any versions of packages from the requirements files
update-venv:
./gactar env update --all --dev
105 changes: 103 additions & 2 deletions cmd/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ var (
errPathExists = errors.New("path already exists")

flagSetupDev = false

flagUpdateAll = false

flagUpdatePython = false
flagUpdatePythonPackages = false
flagUpdateDev = false
)

var envCmd = &cobra.Command{
Expand All @@ -45,7 +51,7 @@ var setupCmd = &cobra.Command{
Use: "setup",
Short: "Setup an environment",
Run: func(cmd *cobra.Command, args []string) {
envPath, err := expandPathFlag(cmd.Flags(), "path")
envPath, err := getVirtualEnvironmentPath(cmd.Flags())
if err != nil {
chalk.PrintErr(err)
return
Expand All @@ -59,6 +65,31 @@ var setupCmd = &cobra.Command{
},
}

var updateCmd = &cobra.Command{
Use: "update",
Short: "Update an environment",
PreRun: func(cmd *cobra.Command, args []string) {
devSet, _ := cmd.Flags().GetBool("dev")
allSet, _ := cmd.Flags().GetBool("all")
if devSet && !allSet {
cmd.MarkFlagRequired("pip")
}
},
Run: func(cmd *cobra.Command, args []string) {
envPath, err := getVirtualEnvironmentPath(cmd.Flags())
if err != nil {
chalk.PrintErr(err)
return
}

err = runUpdate(envPath)
if err != nil {
chalk.PrintErr(err)
return
}
},
}

type errCCLSystem struct {
OSName string
}
Expand All @@ -68,11 +99,17 @@ func (e errCCLSystem) Error() string {
}

func init() {
setupCmd.Flags().StringP("path", "p", "./env", "directory for env files (it will be created if it does not exist)")
setupCmd.Flags().BoolVar(&flagSetupDev, "dev", false, "install dev packages")

envCmd.AddCommand(setupCmd)

updateCmd.Flags().BoolVar(&flagUpdateAll, "all", false, "update all tools & packages")
updateCmd.Flags().BoolVar(&flagUpdatePython, "python", false, "update python version")
updateCmd.Flags().BoolVar(&flagUpdatePythonPackages, "pip", false, "update python packages")
updateCmd.Flags().BoolVar(&flagUpdateDev, "dev", false, "update dev packages")

envCmd.AddCommand(updateCmd)

rootCmd.AddCommand(envCmd)
}

Expand Down Expand Up @@ -244,3 +281,67 @@ func downloadGitHubRelease(name, repo, version, archiveFile, target string) (err

return
}

func runUpdate(envPath string) (err error) {
fmt.Println("gactar Environment Update\n---")
fmt.Printf("Updating environment: %q\n", envPath)

if flagUpdateAll || flagUpdatePython {
err = updatePython(envPath)
if err != nil {
return
}
}

if flagUpdateAll || flagUpdatePythonPackages {
err = updatePipPackages(envPath)
if err != nil {
return
}
}

return
}

func updatePython(envPath string) (err error) {
fmt.Println()
fmt.Println("Updating Python\n---")

path, err := python.FindPython3(true)
if err != nil {
return
}

output, err := executil.ExecCommand(path, "-m", "venv", "--upgrade", envPath)
if err != nil {
return
}

fmt.Print(output)

return
}

func updatePipPackages(envPath string) (err error) {
fmt.Println()
fmt.Println("Updating Python pip packages\n---")

err = cli.SetupPaths(envPath)
if err != nil {
return
}

file := "install/requirements.txt"
if flagUpdateDev {
file = "install/requirements-dev.txt"
}

output, err := executil.ExecCommand("pip", "install", "-U", "-r", file)
if err != nil {
return
}

fmt.Print(output)

return
}
20 changes: 15 additions & 5 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,21 +253,31 @@ func createTempDirFromFlag(flags *pflag.FlagSet) (path string, err error) {
return
}

// setupVirtualEnvironment will check that the environment exists and set our paths.
func setupVirtualEnvironment(flags *pflag.FlagSet) (path string, err error) {
envPath, err := expandPathFlag(flags, "env")
// getVirtualEnvironmentPath gets the environment path from the flags and checks if it exists.
func getVirtualEnvironmentPath(flags *pflag.FlagSet) (envPath string, err error) {
envPath, err = expandPathFlag(flags, "env")
if err != nil {
return
return "", err
}

if !filesystem.DirExists(envPath) {
err = &errVirtualEnvDoesNotExist{path: envPath}
return
return "", err
}

fmt.Print(chalk.Header("Using virtual environment: "))
fmt.Printf("%q\n", envPath)

return
}

// setupVirtualEnvironment will check that the environment path exists and set our PATH with it.
func setupVirtualEnvironment(flags *pflag.FlagSet) (path string, err error) {
envPath, err := getVirtualEnvironmentPath(flags)
if err != nil {
return
}

err = cli.SetupPaths(envPath)
if err != nil {
return
Expand Down

0 comments on commit ebc04a6

Please sign in to comment.