From a2df51b40e0f8468b5d56d080b824fd9274d80a1 Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Tue, 26 Aug 2014 02:01:11 +0400 Subject: [PATCH] Commands mirror/repo/snapshot search. #81 --- cmd/mirror.go | 1 + cmd/mirror_search.go | 26 ++++++++++ cmd/repo.go | 1 + cmd/repo_search.go | 26 ++++++++++ cmd/snapshot.go | 1 + cmd/snapshot_search.go | 107 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 162 insertions(+) create mode 100644 cmd/mirror_search.go create mode 100644 cmd/repo_search.go create mode 100644 cmd/snapshot_search.go diff --git a/cmd/mirror.go b/cmd/mirror.go index 500ba189..48c734a7 100644 --- a/cmd/mirror.go +++ b/cmd/mirror.go @@ -56,6 +56,7 @@ func makeCmdMirror() *commander.Command { makeCmdMirrorUpdate(), makeCmdMirrorRename(), makeCmdMirrorEdit(), + makeCmdMirrorSearch(), }, } } diff --git a/cmd/mirror_search.go b/cmd/mirror_search.go new file mode 100644 index 00000000..23205a33 --- /dev/null +++ b/cmd/mirror_search.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "github.com/smira/commander" + "github.com/smira/flag" +) + +func makeCmdMirrorSearch() *commander.Command { + cmd := &commander.Command{ + Run: aptlySnapshotMirrorRepoSearch, + UsageLine: "search ", + Short: "search mirror for packages matching query", + Long: ` +Command search displays list of packages in mirror that match package query + +Example: + + $ aptly mirror search wheezy-main '$Architecture (i386), Name (% *-dev)' +`, + Flag: *flag.NewFlagSet("aptly-mirror-show", flag.ExitOnError), + } + + cmd.Flag.Bool("with-deps", false, "include dependencies into search results") + + return cmd +} diff --git a/cmd/repo.go b/cmd/repo.go index 94ae0b2e..2823a149 100644 --- a/cmd/repo.go +++ b/cmd/repo.go @@ -20,6 +20,7 @@ func makeCmdRepo() *commander.Command { makeCmdRepoRemove(), makeCmdRepoShow(), makeCmdRepoRename(), + makeCmdRepoSearch(), }, } } diff --git a/cmd/repo_search.go b/cmd/repo_search.go new file mode 100644 index 00000000..e681a339 --- /dev/null +++ b/cmd/repo_search.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "github.com/smira/commander" + "github.com/smira/flag" +) + +func makeCmdRepoSearch() *commander.Command { + cmd := &commander.Command{ + Run: aptlySnapshotMirrorRepoSearch, + UsageLine: "search ", + Short: "search repo for packages matching query", + Long: ` +Command search displays list of packages in local repository that match package query + +Example: + + $ aptly repo search my-software '$Architecture (i386), Name (% *-dev)' +`, + Flag: *flag.NewFlagSet("aptly-repo-show", flag.ExitOnError), + } + + cmd.Flag.Bool("with-deps", false, "include dependencies into search results") + + return cmd +} diff --git a/cmd/snapshot.go b/cmd/snapshot.go index 47207921..898ebe83 100644 --- a/cmd/snapshot.go +++ b/cmd/snapshot.go @@ -18,6 +18,7 @@ func makeCmdSnapshot() *commander.Command { makeCmdSnapshotMerge(), makeCmdSnapshotDrop(), makeCmdSnapshotRename(), + makeCmdSnapshotSearch(), }, } } diff --git a/cmd/snapshot_search.go b/cmd/snapshot_search.go new file mode 100644 index 00000000..853d2c15 --- /dev/null +++ b/cmd/snapshot_search.go @@ -0,0 +1,107 @@ +package cmd + +import ( + "fmt" + "github.com/smira/aptly/deb" + "github.com/smira/aptly/query" + "github.com/smira/commander" + "github.com/smira/flag" +) + +func aptlySnapshotMirrorRepoSearch(cmd *commander.Command, args []string) error { + var err error + if len(args) != 2 { + cmd.Usage() + return commander.ErrCommandError + } + + name := args[0] + command := cmd.Parent.Name() + + var reflist *deb.PackageRefList + + if command == "snapshot" { + snapshot, err := context.CollectionFactory().SnapshotCollection().ByName(name) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + err = context.CollectionFactory().SnapshotCollection().LoadComplete(snapshot) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + reflist = snapshot.RefList() + } else if command == "mirror" { + repo, err := context.CollectionFactory().RemoteRepoCollection().ByName(name) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + err = context.CollectionFactory().RemoteRepoCollection().LoadComplete(repo) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + reflist = repo.RefList() + } else if command == "repo" { + repo, err := context.CollectionFactory().LocalRepoCollection().ByName(name) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + err = context.CollectionFactory().LocalRepoCollection().LoadComplete(repo) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + reflist = repo.RefList() + } else { + panic("unknown command") + } + + list, err := deb.NewPackageListFromRefList(reflist, context.CollectionFactory().PackageCollection(), context.Progress()) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + list.PrepareIndex() + + q, err := query.Parse(args[1]) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + result, err := list.Filter([]deb.PackageQuery{q}, context.flags.Lookup("with-deps").Value.Get().(bool), + nil, context.DependencyOptions(), context.ArchitecturesList()) + if err != nil { + return fmt.Errorf("unable to search: %s", err) + } + + result.ForEach(func(p *deb.Package) error { + context.Progress().Printf("%s\n", p) + return nil + }) + + return err +} + +func makeCmdSnapshotSearch() *commander.Command { + cmd := &commander.Command{ + Run: aptlySnapshotMirrorRepoSearch, + UsageLine: "search ", + Short: "search snapshot for packages matching query", + Long: ` +Command search displays list of packages in snapshot that match package query + +Example: + + $ aptly snapshot search wheezy-main '$Architecture (i386), Name (% *-dev)' +`, + Flag: *flag.NewFlagSet("aptly-snapshot-search", flag.ExitOnError), + } + + cmd.Flag.Bool("with-deps", false, "include dependencies into search results") + + return cmd +}