From 07cf61a641b40726811a895b5020844ceb00cc6f Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Thu, 27 Feb 2014 16:14:54 +0400 Subject: [PATCH] Command aptly repo remove. --- cmd/repo.go | 1 + cmd/repo_remove.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 cmd/repo_remove.go diff --git a/cmd/repo.go b/cmd/repo.go index 71875a89..9c8c23be 100644 --- a/cmd/repo.go +++ b/cmd/repo.go @@ -14,6 +14,7 @@ func makeCmdRepo() *commander.Command { makeCmdRepoCreate(), makeCmdRepoDrop(), makeCmdRepoList(), + makeCmdRepoRemove(), makeCmdRepoShow(), }, Flag: *flag.NewFlagSet("aptly-repo", flag.ExitOnError), diff --git a/cmd/repo_remove.go b/cmd/repo_remove.go new file mode 100644 index 00000000..1d57ad7b --- /dev/null +++ b/cmd/repo_remove.go @@ -0,0 +1,83 @@ +package cmd + +import ( + "fmt" + "github.com/gonuts/commander" + "github.com/gonuts/flag" + "github.com/smira/aptly/debian" +) + +func aptlyRepoRemove(cmd *commander.Command, args []string) error { + var err error + if len(args) < 2 { + cmd.Usage() + return err + } + + name := args[0] + + localRepoCollection := debian.NewLocalRepoCollection(context.database) + repo, err := localRepoCollection.ByName(name) + if err != nil { + return fmt.Errorf("unable to remove: %s", err) + } + + err = localRepoCollection.LoadComplete(repo) + if err != nil { + return fmt.Errorf("unable to remove: %s", err) + } + + context.progress.Printf("Loading packages...\n") + + packageCollection := debian.NewPackageCollection(context.database) + list, err := debian.NewPackageListFromRefList(repo.RefList(), packageCollection) + if err != nil { + return fmt.Errorf("unable to load packages: %s", err) + } + + list.PrepareIndex() + toRemove, err := list.Filter(args[1:], false, nil, 0, nil) + if err != nil { + return fmt.Errorf("unable to remove: %s", err) + } + + toRemove.ForEach(func(p *debian.Package) error { + list.Remove(p) + context.progress.ColoredPrintf("@r[-]@| %s removed", p) + return nil + }) + + if cmd.Flag.Lookup("dry-run").Value.Get().(bool) { + context.progress.Printf("\nChanges not saved, as dry run has been requested.\n") + } else { + repo.UpdateRefList(debian.NewPackageRefListFromPackageList(list)) + + err = localRepoCollection.Update(repo) + if err != nil { + return fmt.Errorf("unable to save: %s", err) + } + } + + return err +} + +func makeCmdRepoRemove() *commander.Command { + cmd := &commander.Command{ + Run: aptlyRepoRemove, + UsageLine: "remove ...", + Short: "remove packages from local repository", + Long: ` +Commands removes packages matching specs from local repository. If removed +packages are not referenced by other repos or snapshots, they can be removed +completely (including files) by running 'aptly db cleanup'. + +ex: + $ aptly repo remove testing 'myapp (=0.1.12)' +`, + Flag: *flag.NewFlagSet("aptly-repo-add", flag.ExitOnError), + } + + cmd.Flag.Bool("dry-run", false, "don't remove, just show what would be removed") + + return cmd +}