fix: build during 'version_autogen.go' generation on complex origins. '^' is used...
[git-purged.git] / main.go
1 // This file is a part of 'git-purged' tool, https://thekondor.net
2
3 package main
4
5 import (
6     "git_purged"
7     "os"
8     "fmt"
9     "flag"
10     logger "log"
11 )
12
13 type App struct {
14     git *git_purged.Git
15     branches git_purged.Branches
16     log *logger.Logger
17 }
18
19 func NewApp(git *git_purged.Git, log *logger.Logger) App {
20     return App{
21         git : git,
22         branches : git_purged.NewBranches(*git),
23         log : log,
24     }
25 }
26
27 func (self App) PrintPurgedBranches(pruneBefore bool) {
28     if pruneBefore {
29         self.pruneRemoteOrigin()
30     }
31
32     goneBranchNames, err := self.branches.ListGone()
33     if nil != err {
34         self.log.Fatalf("Failed to list purged branches: %v\n", err)
35     }
36
37     self.list(goneBranchNames)
38 }
39
40 func (self App) PrintAliveBranches(pruneBefore bool) {
41     if pruneBefore {
42         self.pruneRemoteOrigin()
43     }
44
45     nonGoneBranchNames, err := self.branches.ListNonGone()
46     if nil != err {
47         self.log.Fatalf("Failed to list non-purged branches: %v\n", err)
48     }
49
50     self.list(nonGoneBranchNames)
51 }
52
53 func (self App) list(branchNames []string) {
54     if 0 == len(branchNames) {
55         self.log.Printf("No branches to show. Didn't you forget to call 'git fetch' before?")
56         return
57     }
58
59     for _, name := range branchNames {
60         fmt.Println(name)
61     }
62 }
63
64 func (self App) pruneRemoteOrigin() {
65     if err := self.git.PruneRemoteOrigin(); nil != err {
66         self.log.Fatalf("Failed to prune remote origin: %v\n", err)
67     }
68 }
69
70 func NewGit(log *logger.Logger) *git_purged.Git{
71     git, err := git_purged.NewGit(git_purged.NewGitExternalCommand())
72     if nil == err {
73         return git
74     }
75
76     if git_purged.GitNotAvailableErr == err {
77         log.Fatal("Error: 'git' command is not available or misconfigured");
78     } else {
79         log.Fatalf("Error: 'git' command cannot be used (%v)\n", err)
80     }
81
82     return nil
83 }
84
85 func main() {
86     log := logger.New(os.Stdout, "[git-purged] ", 0)
87
88     inverseFlag := flag.Bool("inverse", false, "Inverse output by printing alive branches only. Optional.")
89     skipPruneFlag := flag.Bool("skip-prune", false, "Skip prunning of remote's origin to calculate purged branches before listing. Optional.")
90     helpFlag := flag.Bool("help", false, "Show this help.")
91
92     flag.Parse()
93     if *helpFlag {
94         fmt.Printf("git-purged - subcommand to list purged (already removed on a remote master) branches.\n")
95         fmt.Printf("             build: %s#%s (%s)\n\n", BuildDate, BuildGitCommit, BuildGitOrigin)
96         flag.PrintDefaults()
97         fmt.Println()
98         log.Fatalf("No action requested")
99     }
100
101     git := NewGit(log)
102     if !git.IsRepository() {
103         log.Fatalf("Current directory is not a valid working git tree")
104     }
105
106     app := NewApp(git, log)
107     if *inverseFlag {
108         app.PrintAliveBranches(*skipPruneFlag)
109     } else {
110         app.PrintPurgedBranches(*skipPruneFlag)
111     }
112 }
113