aboutsummaryrefslogtreecommitdiff
path: root/internal/rtree/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/rtree/main.go')
-rw-r--r--internal/rtree/main.go171
1 files changed, 171 insertions, 0 deletions
diff --git a/internal/rtree/main.go b/internal/rtree/main.go
new file mode 100644
index 0000000..d1692cd
--- /dev/null
+++ b/internal/rtree/main.go
@@ -0,0 +1,171 @@
+/*******************************************************************************
+*
+* Copyright 2017 Stefan Majewsky <majewsky@gmx.net>
+*
+* This program is free software: you can redistribute it and/or modify it under
+* the terms of the GNU General Public License as published by the Free Software
+* Foundation, either version 3 of the License, or (at your option) any later
+* version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT ANY
+* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License along with
+* this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*******************************************************************************/
+
+package rtree
+
+import (
+ "strings"
+
+ "github.com/majewsky/gofu/internal/cli"
+)
+
+//Exec executes the rtree applet and returns an exit code (0 for success, >0
+//for error). The argument is os.Args minus the leading "rtree" or "gofu
+//rtree". All side-effects (reading from stdin, writing to stdout/stderr,
+//executing other programs) pass through cli.Interface and can be intercepted
+//there for the purpose of testing.
+func Exec(args []string) int {
+ if !Init() {
+ return 1
+ }
+
+ if len(args) == 0 {
+ return usage()
+ }
+
+ index, errs := ReadIndex()
+ if len(errs) > 0 {
+ for _, err := range errs {
+ cli.Interface.ShowError(err.Error())
+ }
+ return 1
+ }
+
+ var err error
+ switch args[0] {
+ case "get":
+ if len(args) != 2 {
+ return usage()
+ }
+ err = commandGet(index, args[1])
+ case "drop":
+ if len(args) != 2 {
+ return usage()
+ }
+ err = commandDrop(index, args[1])
+ case "index":
+ if len(args) != 1 {
+ return usage()
+ }
+ err = commandIndex(index)
+ case "repos":
+ if len(args) != 1 {
+ return usage()
+ }
+ commandRepos(index)
+ case "remotes":
+ if len(args) != 1 {
+ return usage()
+ }
+ commandRemotes(index)
+ case "import":
+ if len(args) != 2 {
+ return usage()
+ }
+ err = commandImport(index, args[1])
+ case "each":
+ if len(args) < 2 {
+ return usage()
+ }
+ return commandEach(index, args[1:])
+ default:
+ return usage()
+ }
+
+ if err == nil {
+ return 0
+ }
+ cli.Interface.ShowError(err.Error())
+ return 1
+}
+
+var usageStr = strings.TrimSpace(`
+Usage:
+ rtree [get|drop] <url>
+ rtree [index|repos|remotes]
+ rtree import <path>
+ rtree each <command>
+`)
+
+func usage() int {
+ cli.Interface.ShowUsage(usageStr)
+ return 1
+}
+
+func commandGet(index *Index, url string) error {
+ repo, err := index.FindRepo(url, true)
+ if err != nil {
+ return err
+ }
+ cli.Interface.ShowResult(repo.AbsolutePath())
+ return nil
+}
+
+func commandDrop(index *Index, url string) error {
+ repo, err := index.FindRepo(url, false)
+ if err != nil {
+ return err
+ }
+ return index.DropRepo(repo)
+}
+
+func commandIndex(index *Index) error {
+ err := index.Rebuild()
+ if err != nil {
+ return err
+ }
+ return index.Write()
+}
+
+func commandRepos(index *Index) {
+ var items []string
+ for _, repo := range index.Repos {
+ items = append(items, repo.CheckoutPath)
+ }
+ cli.Interface.ShowResultsSorted(items)
+}
+
+func commandRemotes(index *Index) {
+ var items []string
+ for _, repo := range index.Repos {
+ for _, remote := range repo.Remotes {
+ items = append(items, remote.URL)
+ }
+ }
+ cli.Interface.ShowResultsSorted(items)
+}
+
+func commandEach(index *Index, cmdline []string) (exitCode int) {
+ exitCode = 0
+ for _, repo := range index.Repos {
+ err := repo.Exec(cmdline...)
+ if err != nil {
+ cli.Interface.ShowError(err.Error())
+ exitCode = 1
+ }
+ }
+ return
+}
+
+func commandImport(index *Index, dirPath string) error {
+ err := index.ImportRepo(dirPath)
+ if err != nil {
+ return err
+ }
+ return index.Write()
+}