diff options
| author | Jeff Carr <[email protected]> | 2024-12-17 00:00:49 -0600 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2024-12-17 00:00:49 -0600 |
| commit | c53da5a9a1da1b29db24d4e1ce2b294514d99ac2 (patch) | |
| tree | c39b33f43d5be87313b3c0aa0c7bb7c58b2f72b6 /changed.go | |
| parent | a115ba144b00dc0339a8cf7eae6bdf2aab5fb4b5 (diff) | |
smarter and faster mtime logic
Diffstat (limited to 'changed.go')
| -rw-r--r-- | changed.go | 97 |
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 +} |
