package configsrc import ( "context" "fmt" "os" "time" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" "golang.org/x/crypto/ssh" "tug/internal/platform/replica" ) type CheckpointHead struct { Commit string Time time.Time Signer ssh.PublicKey } func InspectCheckpoint(ctx context.Context, stateDir string, in Input) (CheckpointHead, error) { var result CheckpointHead checkpoint, err := commitID(in.Checkpoint, false) if err != nil || checkpoint.IsZero() { return result, fmt.Errorf("no checkpoint is set; a first start needs no reset") } dir, err := os.MkdirTemp(stateDir, "config-checkpoint-") if err != nil { return result, err } defer os.RemoveAll(dir) s := &Source{dir: dir} auth, err := s.auth(in) if err != nil { return result, err } repo, err := s.repo() if err != nil { return result, err } head, err := replica.Fetch(ctx, repo, in.Remote.URL, auth, plumbing.ReferenceName("refs/heads/"+in.Remote.Branch)) if err != nil { return result, fmt.Errorf("unreachable: %w", err) } if head.IsZero() { return result, errEmpty } key, refused, err := verify(repo.Storer, head, in.Signers) if err != nil { return result, err } if refused != nil { return result, fmt.Errorf("%s: %w", refused.kind, refused.cause) } found, err := walk(repo.Storer, head, checkpoint) if err != nil { return result, err } if found { return result, fmt.Errorf("the branch still holds the checkpoint; an ordinary start repairs the clone") } commit, err := object.GetCommit(repo.Storer, head) if err != nil { return result, err } return CheckpointHead{Commit: head.String(), Time: commit.Committer.When, Signer: key}, nil }