summaryrefslogtreecommitdiff
path: root/doStats.go
blob: d875880ecacab7f6078f1469a7e0244bc71fd855 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0

package main

import (
	"errors"
	"fmt"
	"os"
	"path/filepath"

	"go.wit.com/lib/env"
	"go.wit.com/lib/protobuf/gitpb"
	"go.wit.com/log"
)

//	/tmp/go-nsupdate$ git ls-remote
//	From [email protected]:SpComb/go-nsupdate.git
//	d65f28d10991354b3af0168001a4beea6b8242f9	HEAD
//	d65f28d10991354b3af0168001a4beea6b8242f9	refs/heads/master
//	fb04ebe13a16c01e1a7eb3892a0aca8c6db96fa0	refs/pull/3/head
//	d774220311b2d44c770e7431ec663c8875488a1e	refs/pull/6/head
//	fefb9ea80745893a2203576bdc2872d33e539064	refs/pull/7/head
//	c09c90d0a931888862262a6ed3753eed0af4ddca	refs/pull/8/head

func doStats(cmd *StatsCmd) (string, error) {
	if cmd.All != nil {
		if cmd.Reload {
			fixed := me.forge.RunOnRepos(me.forge.Repos, doReload)
			if fixed.Len() == 0 {
				return "no git config changes", nil
			}

			// show the changed repos & save cache .pb file
			fixed = fixed.SortActual()
			footer := me.forge.PrintErrorsTB(fixed)
			me.forge.Repos.SaveVerbose()
			return ".git/config problems: " + footer, nil
		}
		if cmd.ReloadClean {
			var counter int
			for repo := range me.forge.Repos.IterAll() {
				os.Chdir(repo.FullPath)
				globPattern := ".git/*.pb"
				files, err := filepath.Glob(globPattern)
				if err != nil {
					log.Info("glob error", err, files)
					continue
				}
				for _, filename := range files {
					log.Info("DELETE", filename)
					counter += 1
					os.Remove(filename)
				}
			}
			return fmt.Sprintf("cleaned %d pb files", counter), nil
		}
	}

	repo := workingDirToRepo()
	if repo == nil {
		return "no repo", errors.New("working dir isn't a repo I know about")
	}
	if cmd.Repo != "" {
		r := me.forge.Repos.FindByNamespace(cmd.Repo)
		if r == nil {
			return "no repo " + cmd.Repo, errors.New("no repo " + cmd.Repo)
		}
		for _, rmote := range r.Config.Remotes {
			stats, err := r.LoadRemoteRefs(rmote.Name)
			if err != nil {
				// return err
			}
			if env.True("resort") {
				stats.SaveByHash()
				log.Info("stats should have been resorted and saved")
			} else {
				footer := stats.PrintTable()
				log.Info("full remote refs footer:", footer)
			}
		}
		return "remote refs table", nil
	}

	if cmd.Reload {
		err := doReload(repo)
		return "doReload()", err
	}

	if cmd.CheckRefs {
		err := doCheckRefs(repo)
		return "checked refs", err
	}

	if cmd.CheckRemote {
		err := doCheckRemote(repo)
		return "checked remote refs", err
	}

	if cmd.CheckRemoteRefs {
		err := doCheckRemoteRefs(repo)
		return "checked remote refs", err
	}

	if cmd.UpdateRefs {
		err := doUpdateRefs(repo)
		return "update refs", err
	}

	if cmd.UpdateRemote {
		err := doUpdateRemote(repo)
		return "update remote", err
	}

	if cmd.UpdateRemoteRefs {
		err := doUpdateRemoteRefs(repo)
		return "update remote refs", err
	}

	if cmd.List {
	}

	return "do what?", nil
}

func doCheckRefs(r *gitpb.Repo) error {
	stats, err := r.LoadRefs()
	if err != nil {
		return err
	}

	if env.True("resort") {
		stats.SaveByHash()
		log.Info("stats should have been resorted and saved")
		return nil
	}
	footer := stats.PrintTable()
	log.Info("stats footer:", footer)
	return nil
}

func doCheckRemote(r *gitpb.Repo) error {
	for _, rmote := range r.Config.Remotes {
		morestats, err := r.MakeRemote(rmote.Name)
		if err != nil {
			// return err
		}
		if env.True("resort") {
			morestats.SaveByHash()
			return errors.New("stats should have been resorted and saved")
		}
		footer := morestats.PrintTable()
		log.Printf("full %s remote refs footer: %s\n", rmote.Name, footer)
	}

	return nil
}

func doCheckRemoteRefs(r *gitpb.Repo) error {
	for _, rmote := range r.Config.Remotes {
		morestats, err := r.MakeRemoteRefs(rmote.Name)
		if err != nil {
			// return err
		}
		if env.True("resort") {
			morestats.SaveByHash()
			return errors.New("stats should have been resorted and saved")
		}
		footer := morestats.PrintTable()
		log.Printf("full %s remote refs footer: %s\n", rmote.Name, footer)
	}

	return nil
}

func doUpdateRefs(r *gitpb.Repo) error {
	stats, err := r.LoadRefs()
	if err != nil {
		return err
	}

	footer := stats.PrintTableLimit(2)
	log.Info("stats footer:", footer)

	err = r.UpdateRefs(stats)
	return err
}

func doUpdateRemote(r *gitpb.Repo) error {
	for _, rmote := range r.Config.Remotes {
		err := r.UpdateRemote(rmote.Name)
		if err != nil {
			return err
		}
		// footer := morestats.PrintTableLimit(20)
		log.Printf("full %s remote update remote footer\n", rmote.Name)
	}

	return nil
}

func doUpdateRemoteRefs(r *gitpb.Repo) error {
	for _, rmote := range r.Config.Remotes {
		/*
			morestats, err := r.LoadRemoteRefs(rmote.Name)
			if err != nil {
				return err
			}
		*/

		err := r.UpdateRemoteRefs(rmote.Name)
		if err != nil {
			return err
		}
	}

	return nil
}