summaryrefslogtreecommitdiff
path: root/stat.SortCtime.go
blob: 7e3b41a3013a721b1c225f0836ee5430be46c435 (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
// Code generated by go.wit.com/apps/autogenpb DO NOT EDIT.
//     go install go.wit.com/apps/autogenpb@latest
//
// This file was autogenerated with autogenpb:
//  autogenpb v0.5.27    Built on  2025/10/16 17:13:05  ( 52 m)
// Theese sort.pb.go and marshal.pb.go files are autogenerated
// The autogenpb sources have example .proto files with instructions
//

package gitpb

import (
	"fmt"
	"sort"
	"strings"

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

func (pb *Stats) SortCtime() {
	statMu.Lock()
	defer statMu.Unlock()

	sort.Sort(sortStatCtime(pb.Stats))
}

// sort struct by Ctime
type sortStatCtime []*Stat

func (a sortStatCtime) Len() int { return len(a) }
func (a sortStatCtime) Less(i, j int) bool {
	itime := a[i].CommitTime.AsTime()
	jtime := a[j].CommitTime.AsTime()
	return itime.Before(jtime)
}
func (a sortStatCtime) Swap(i, j int) { a[i], a[j] = a[j], a[i] }

// sort tags by Version()
// returns true if anything changed
var wasSorted bool

func (pb *Stats) SortVersion() bool {
	statMu.Lock()
	defer statMu.Unlock()

	wasSorted = true

	sort.Sort(sortStatVersion(pb.Stats))

	return wasSorted
}

func tokVersion(r *Stat) (*Vers, error) {
	var ver string
	if strings.HasPrefix(r.Name, "refs/tags/") {
		ver = strings.TrimPrefix(r.Name, "refs/tags/")
	} else if strings.HasPrefix(r.Name, "refs/heads/") {
		ver = strings.TrimPrefix(r.Name, "refs/heads/")
	} else if strings.HasPrefix(r.Name, "refs/remotes/") {
		ver = strings.TrimPrefix(r.Name, "refs/remotes/")
	} else if strings.HasPrefix(r.Name, "refs/") {
		ver = strings.TrimPrefix(r.Name, "refs/")
	} else {
		ver = fmt.Sprintf("%s", r.Name)
	}
	tok, err := TokenVersions(ver)
	return tok, err
}

// sort struct by Version
type sortStatVersion []*Stat

func (a sortStatVersion) Len() int { return len(a) }
func (a sortStatVersion) Less(i, j int) bool {
	atok, err1 := tokVersion(a[i])
	btok, err2 := tokVersion(a[j])
	_, _ = err1, err2
	cint := CompareVers(atok, btok)
	if cint == 1 {
		if env.True("stats") {
			log.Info("false one", atok, "vs", btok, err1, err2, a[i].Name, a[j].Name)
		}
		return false
	}
	if cint == -1 {
		if env.True("stats") {
			log.Info("true less", atok, "vs", btok, err1, err2, err2, a[i].Name, a[j].Name)
		}
		wasSorted = false
		return true
	}
	if env.True("stats") {
		log.Info("false 0  ", atok, "vs", btok, err1, err2, err2, a[i].Name, a[j].Name)
	}
	return false
}

func (a sortStatVersion) Swap(i, j int) { a[i], a[j] = a[j], a[i] }