summaryrefslogtreecommitdiff
path: root/changed.go
blob: d9d4badbd83a69be1844102a804eacaab97331de (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
package gitpb

// An app to submit patches for the 30 GO GUI repos

import (
	"fmt"
	"time"

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

func (repo *Repo) Mtime(fname string) *time.Time {
	var fileTime *time.Time
	tmp, err := repo.oldMtime(fname)
	fileTime = &tmp
	if err != nil {
		log.Info("MTime got err", err)
		return nil
	}
	return fileTime
}

func (repo *Repo) changedDir() bool {
	fname := ".git"
	fileTime := repo.Mtime(fname)
	if fileTime == nil {
		// .git doesn't exist. something is wrong. rescan this repo
		return true
	}
	pbtime := repo.Times.MtimeDir
	mtime := timestamppb.New(*fileTime)
	if (pbtime.Seconds == mtime.Seconds) && (pbtime.Nanos == mtime.Nanos) {
		return false
	}
	dur := mtime.AsTime().Sub(pbtime.AsTime())
	repo.StateChange = fmt.Sprintf("%s changed %s", fname, shell.FormatDuration(dur))
	repo.Times.MtimeDir = mtime
	return true
}

func (repo *Repo) changedHead() bool {
	fname := ".git/HEAD"
	fileTime := repo.Mtime(fname)
	if fileTime == nil {
		// .git/HEAD doesn't exist. something is wrong. rescan this repo
		return true
	}
	pbtime := repo.Times.MtimeHead
	mtime := timestamppb.New(*fileTime)
	if (pbtime.Seconds == mtime.Seconds) && (pbtime.Nanos == mtime.Nanos) {
		return false
	}
	dur := mtime.AsTime().Sub(pbtime.AsTime())
	repo.StateChange = fmt.Sprintf("%s changed %s", fname, shell.FormatDuration(dur))
	repo.Times.MtimeHead = mtime
	return true
}

func (repo *Repo) changedIndex() bool {
	fname := ".git/index"
	fileTime := repo.Mtime(fname)
	if fileTime == nil {
		// .git/index doesn't exist. something is wrong. rescan this repo
		return true
	}
	pbtime := repo.Times.MtimeIndex
	mtime := timestamppb.New(*fileTime)
	if (pbtime.Seconds == mtime.Seconds) && (pbtime.Nanos == mtime.Nanos) {
		return false
	}
	dur := mtime.AsTime().Sub(pbtime.AsTime())
	repo.StateChange = fmt.Sprintf("%s changed %s", fname, shell.FormatDuration(dur))
	repo.Times.MtimeIndex = mtime
	return true
}

func (repo *Repo) RepoChanged() bool {
	var changed bool
	if repo.Times == nil {
		repo.Times = new(GitTimes)
		log.Info(repo.FullPath, "repo.Times were nil")
	}

	if repo.changedHead() {
		changed = true
	}
	if repo.changedIndex() {
		changed = true
	}
	if repo.changedDir() {
		changed = true
	}

	return changed
}