175 lines
4.2 KiB
Go
175 lines
4.2 KiB
Go
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
|
|
}
|
|
mtime := timestamppb.New(*fileTime)
|
|
pbtime := repo.Times.MtimeDir
|
|
if pbtime == nil { // this can happen?
|
|
repo.Times.MtimeDir = mtime
|
|
return true
|
|
}
|
|
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) didFileChange(fname string, pbtime *timestamppb.Timestamp) bool {
|
|
fileTime := repo.Mtime(fname)
|
|
if fileTime == nil {
|
|
// file missing, assume changed
|
|
return true
|
|
}
|
|
mtime := timestamppb.New(*fileTime)
|
|
if pbtime == nil {
|
|
// mtime has not been stored yet
|
|
return true
|
|
}
|
|
if (pbtime.Seconds == mtime.Seconds) && (pbtime.Nanos == mtime.Nanos) {
|
|
// it's the same!
|
|
return false
|
|
}
|
|
// need to reload from the filesystem
|
|
return false
|
|
}
|
|
|
|
// boo. I'm not good at golang. this should use reflect. I'm bad. my code is bad. boo this man. you're cool, I'm outta here
|
|
// make this work right someday
|
|
func (repo *Repo) updateMtime(fname string, pbname string) bool {
|
|
fileTime := repo.Mtime(fname)
|
|
if fileTime == nil {
|
|
// .git/HEAD doesn't exist. something is wrong. rescan this repo
|
|
return true
|
|
}
|
|
mtime := timestamppb.New(*fileTime)
|
|
pbtime := repo.Times.MtimeHead
|
|
if pbtime == nil { // this can happen?
|
|
repo.Times.MtimeHead = mtime
|
|
return true
|
|
}
|
|
switch pbname {
|
|
case "MtimeHead":
|
|
if pbtime == nil { // this can happen?
|
|
repo.Times.MtimeHead = mtime
|
|
return true
|
|
}
|
|
default:
|
|
}
|
|
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) 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
|
|
}
|
|
mtime := timestamppb.New(*fileTime)
|
|
pbtime := repo.Times.MtimeHead
|
|
if pbtime == nil { // this can happen?
|
|
repo.Times.MtimeHead = mtime
|
|
return true
|
|
}
|
|
|
|
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
|
|
}
|
|
mtime := timestamppb.New(*fileTime)
|
|
pbtime := repo.Times.MtimeIndex
|
|
if pbtime == nil { // this can happen?
|
|
repo.Times.MtimeIndex = mtime
|
|
return true
|
|
}
|
|
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) updateMtimes() 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
|
|
}
|
|
|
|
func (repo *Repo) DidRepoChange() bool {
|
|
if repo.didFileChange(".git/HEAD", repo.Times.MtimeHead) {
|
|
return true
|
|
}
|
|
if repo.didFileChange(".git/index", repo.Times.MtimeIndex) {
|
|
return true
|
|
}
|
|
if repo.didFileChange(".git", repo.Times.MtimeDir) {
|
|
// todo: do something with CheckDirty()
|
|
// return true
|
|
}
|
|
return false
|
|
}
|