master
go 62 lines 1.38 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package chartengine
4
5 type buildSeqTransition uint8
6
7 const (
8 buildSeqTransitionNone buildSeqTransition = iota
9 buildSeqTransitionBroken
10 buildSeqTransitionRecovered
11 )
12
13 type buildSeqObservation struct {
14 transition buildSeqTransition
15 previous uint64
16 }
17
18 // observeBuildSuccessSeq tracks LastSuccessSeq monotonicity and reports transition events.
19 // BuildPlan uses this to avoid per-cycle warning spam on persistent sequence regressions.
20 func (e *Engine) observeBuildSuccessSeq(seq uint64) buildSeqObservation {
21 state := &e.state.buildSeq
22 obs := buildSeqObservation{previous: state.lastSuccess}
23 if !state.initialized {
24 state.initialized = true
25 state.lastSuccess = seq
26 state.violating = false
27 return obs
28 }
29
30 if e.state.cfg.runtimePlanner {
31 if seq < state.lastSuccess {
32 if !state.violating {
33 state.violating = true
34 obs.transition = buildSeqTransitionBroken
35 }
36 return obs
37 }
38 if state.violating {
39 state.violating = false
40 obs.transition = buildSeqTransitionRecovered
41 }
42 if seq > state.lastSuccess {
43 state.lastSuccess = seq
44 }
45 return obs
46 }
47
48 if seq <= state.lastSuccess {
49 if !state.violating {
50 state.violating = true
51 obs.transition = buildSeqTransitionBroken
52 }
53 return obs
54 }
55
56 state.lastSuccess = seq
57 if state.violating {
58 state.violating = false
59 obs.transition = buildSeqTransitionRecovered
60 }
61 return obs
62 }