Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify "purge" command #12

Merged
merged 1 commit into from
Dec 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion cli/model/commands/cmd_kpm/purge.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"github.com/rohitramu/kpm/pkg"
)

// TODO: Merge the "purge" command into the "remove" command (use flags to determine behavior).
var Purge = &types.Command{
Name: constants.CmdPurge,
ShortDescription: "Removes all versions of a template package.",
Expand Down
68 changes: 5 additions & 63 deletions pkg/purge.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@ package pkg

import (
"fmt"
"os"

"github.com/rohitramu/kpm/pkg/utils/files"
"github.com/rohitramu/kpm/pkg/utils/local_package_repo"
"github.com/rohitramu/kpm/pkg/utils/log"
"github.com/rohitramu/kpm/pkg/utils/template_package"
"github.com/rohitramu/kpm/pkg/utils/user_prompts"
"github.com/rohitramu/kpm/pkg/utils/validation"
)

// PurgeCmd removes all versions of a template package from the local KPM repository.
Expand All @@ -17,58 +15,14 @@ func PurgeCmd(
userHasConfirmed bool,
kpmHomeDirPath string,
) error {
var err error
var ok bool

// Get KPM home directory.
var kpmHomeDir string
kpmHomeDir, err = files.GetAbsolutePath(kpmHomeDirPath)
kpmHomeDir, err := files.GetAbsolutePath(kpmHomeDirPath)
if err != nil {
return err
}

// Find all packages and versions.
var packages template_package.PackageNamesAndVersions
packages, err = template_package.GetAvailablePackagesAndVersions(kpmHomeDir)
if err != nil {
return fmt.Errorf("failed to retrieve the list of available packages in the local KPM repository: %s", err)
}

// Exit early if there are no packages.
if len(packages) == 0 {
return nil
}

// Create function to remove all versions of a package
var removeAllVersions = func(currentPackageName string) error {
// Get the versions of this package
var versions []string
versions, ok = packages[currentPackageName]
if !ok {
return fmt.Errorf("failed to find package in the local KPM repository: %s", currentPackageName)
}

// Remove the package
for _, ver := range versions {
var packageFullName = template_package.GetPackageFullName(currentPackageName, ver)
var packageDir = template_package.GetPackageDir(kpmHomeDir, packageFullName)
err = os.RemoveAll(packageDir)
if err != nil {
return fmt.Errorf("failed to remove package \"%s\" from the local KPM repository: %s", packageFullName, err)
}
}

return nil
}

// If we only want to remove all versions of a single package, iterate over just that package's versions.
if packageName != "" {
// Validate package name.
err = validation.ValidatePackageName(packageName)
if err != nil {
return err
}

// Get user confirmation.
if !userHasConfirmed {
if userHasConfirmed, err = user_prompts.ConfirmWithUser("All versions of package '%s' will be deleted from the local KPM repository.", packageName); err != nil {
Expand All @@ -80,15 +34,11 @@ func PurgeCmd(
}
}

// Remove the package.
err = removeAllVersions(packageName)
if err != nil {
return err
}
return local_package_repo.RemoveAllVersionsOfPackages(packageName)
} else {
// Get user confirmation.
if !userHasConfirmed {
if userHasConfirmed, err = user_prompts.ConfirmWithUser("All versions of all %d packages will be deleted from the local KPM repository.", len(packages)); err != nil {
if userHasConfirmed, err = user_prompts.ConfirmWithUser("All versions of all packages will be deleted from the local KPM repository."); err != nil {
log.Panicf("Failed to get user confirmation. \n%s", err)
}

Expand All @@ -97,14 +47,6 @@ func PurgeCmd(
}
}

// Purge the local KPM repository of all packages
for packageName := range packages {
err = removeAllVersions(packageName)
if err != nil {
return err
}
}
return local_package_repo.RemoveAllVersionsOfAllPackages(kpmHomeDir)
}

return nil
}
75 changes: 75 additions & 0 deletions pkg/utils/local_package_repo/utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package local_package_repo

import (
"fmt"
"os"

"github.com/rohitramu/kpm/pkg/utils/template_package"
"golang.org/x/exp/maps"
)

func RemoveAllVersionsOfPackages(kpmHomeDir string, packageNames ...string) error {
var err error

if len(packageNames) == 0 {
return nil
}

// Find all packages and versions.
var packages template_package.PackageNamesAndVersions
packages, err = template_package.GetAvailablePackagesAndVersions(kpmHomeDir)
if err != nil {
return fmt.Errorf("failed to retrieve the list of available packages in the local KPM repository: %s", err)
}

return removeAllVersionsOfPackages(kpmHomeDir, packages, packageNames...)
}

func RemoveAllVersionsOfAllPackages(kpmHomeDir string) error {
var err error

// Find all packages and versions.
var packages template_package.PackageNamesAndVersions
packages, err = template_package.GetAvailablePackagesAndVersions(kpmHomeDir)
if err != nil {
return fmt.Errorf("failed to retrieve the list of available packages in the local KPM repository: %s", err)
}

return removeAllVersionsOfPackages(kpmHomeDir, packages, maps.Keys(packages)...)
}

func removeAllVersionsOfPackages(
kpmHomeDir string,
packages template_package.PackageNamesAndVersions,
packageNames ...string,
) error {
var err error

// Exit early if there are no packages.
if len(packages) == 0 {
return nil
}

// Delete all versions of packages.
for _, packageName := range packageNames {
// Get the versions of this package.
var versions []string
var ok bool
versions, ok = packages[packageName]
if !ok {
return fmt.Errorf("failed to find package in the local KPM repository: %s", packageName)
}

// Remove the package.
for _, ver := range versions {
var packageFullName = template_package.GetPackageFullName(packageName, ver)
var packageDir = template_package.GetPackageDir(kpmHomeDir, packageFullName)
err = os.RemoveAll(packageDir)
if err != nil {
return fmt.Errorf("failed to remove package \"%s\" from the local KPM repository: %s", packageFullName, err)
}
}
}

return nil
}