summaryrefslogtreecommitdiff
path: root/update.go
blob: 8e2a12b0030c3535845e2a7c8899c1aad2fddfa7 (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
package gitpb

import (
	"path/filepath"
	"slices"
	"strings"
	"time"

	"go.wit.com/lib/gui/shell"
	"go.wit.com/log"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
)

// this is becoming a standard format
// todo: autogenerate this from the .proto file?

// Update version and timestamp.
// returns ok (ok == true if not found)
func (r *Repo) Update() error {
	// delete the old hash
	// r.DeleteByHash(hash)
	r.Refs = nil

	tags := []string{"%(objectname)", "%(creatordate)", "%(*authordate)", "%(refname)", "%(subject)"}
	format := strings.Join(tags, "_,,,_")
	cmd := []string{"git", "for-each-ref", "--sort=taggerdate", "--format", format}
	// log.Info("RUNNING:", strings.Join(cmd, " "))
	result := shell.PathRunQuiet(r.FullPath, cmd)
	if result.Error != nil {
		log.Warn("git for-each-ref error:", result.Error)
		return result.Error
	}

	lines := result.Stdout
	// reverse the git order
	slices.Reverse(lines)

	var refName string
	var hash string
	var subject string
	var ctime time.Time

	for i, line := range lines {
		var parts []string
		parts = make([]string, 0)
		parts = strings.Split(line, "_,,,_")
		if len(parts) != 5 {
			log.Info("tag error:", i, parts)
			continue
		}
		refName = parts[3]
		hash = parts[0]

		ctime = getGitDateStamp(parts[1])

		subject = parts[4]
	}

	newr := Ref{
		Hash:    hash,
		Subject: subject,
		RefName: refName,
		Ctime:   timestamppb.New(ctime),
	}

	r.AppendRef(&newr)
	return nil
}

// converts a git for-each-ref date. "Wed Feb 7 10:13:38 2024 -0600"
func getGitDateStamp(gitdefault string) time.Time {
	// now := time.Now().Format("Wed Feb 7 10:13:38 2024 -0600")
	const gitLayout = "Mon Jan 2 15:04:05 2006 -0700"
	tagTime, err := time.Parse(gitLayout, gitdefault)
	if err != nil {
		log.Warn("GOT THIS IN PARSE AAA." + gitdefault + ".AAA")
		log.Warn(err)
		return time.Now()
	}
	return tagTime
}

// scans in a new git repo. If it detects the repo is a golang project,
// then it parses the go.mod/go.sum files
// TODO: try adding python, rails, perl, rust, other language things?
// I probably will never have time to try that, but I'd take patches for anyone
// that might see this note and feel so inclined.
func (r *Repos) InitNewGoPath(basepath string, gopath string) *Repo {
	if oldr := r.FindByPath(gopath); oldr != nil {
		// already had this gopath
		return oldr
	}
	// add a new one here
	newr := Repo{
		FullPath: filepath.Join(basepath, gopath),
		GoPath:   gopath,
	}
	newr.Update()

	r.Append(&newr)
	return &newr
}