Tell a rebuild that changes nothing by its artifacts and its manifest (hq ADR 0236)
This commit is contained in:
@@ -2,6 +2,8 @@ package inventory
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
@@ -216,3 +218,30 @@ func (i *Inventory) RestoreModule(ctx context.Context, b Build) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// BuildFingerprints is, per commit, what the newest successful build of a module from it would put on a
|
||||
// machine — its artifacts and its manifest, hashed — so a rebuild that changes nothing there is told
|
||||
// from one that does (the bus's planned step, ADR 0236).
|
||||
func (i *Inventory) BuildFingerprints(ctx context.Context, module string) (map[string]string, error) {
|
||||
rows, err := i.store.Pool().Query(ctx,
|
||||
`select commit_hash, made, coalesce(manifest::text, '') from build
|
||||
where module = $1 and failed = '' and commit_hash <> '' order by at desc limit 50`, module)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
out := map[string]string{}
|
||||
for rows.Next() {
|
||||
var commit, manifest string
|
||||
var made []byte
|
||||
if err := rows.Scan(&commit, &made, &manifest); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if _, seen := out[commit]; seen {
|
||||
continue
|
||||
}
|
||||
sum := sha256.Sum256(append(append(made, 0), []byte(manifest)...))
|
||||
out[commit] = hex.EncodeToString(sum[:])
|
||||
}
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user