summaryrefslogtreecommitdiff
path: root/changed.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2024-12-17 00:00:49 -0600
committerJeff Carr <[email protected]>2024-12-17 00:00:49 -0600
commitc53da5a9a1da1b29db24d4e1ce2b294514d99ac2 (patch)
treec39b33f43d5be87313b3c0aa0c7bb7c58b2f72b6 /changed.go
parenta115ba144b00dc0339a8cf7eae6bdf2aab5fb4b5 (diff)
smarter and faster mtime logic
Diffstat (limited to 'changed.go')
-rw-r--r--changed.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/changed.go b/changed.go
new file mode 100644
index 0000000..d9d4bad
--- /dev/null
+++ b/changed.go
@@ -0,0 +1,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
+}