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
|
// 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"
"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) {
repo := workingDirToRepo()
if repo == nil {
return "no repo", errors.New("working dir isn't a repo I know about")
}
if cmd.CheckRefs {
err := doCheckRefs(repo)
return "checked refs", err
}
if cmd.CheckRemote {
err := doCheckRemoteRefs(repo)
return "checked remote refs", err
}
if cmd.UpdateRefs {
err := doUpdateRefs(repo)
return "update refs", err
}
if cmd.UpdateRemote {
err := doUpdateRemoteRefs(repo)
return "update remote refs", err
}
if cmd.List {
}
if cmd.All {
fixed := me.forge.RunOnRepos(me.forge.Repos, doUpdateRefs)
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
}
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 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 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 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
}
|