package rootparticipation import ( "context" "errors" "os" ) // MigrationCensus owns the same exclusion as Acquire. Completion never resets // revisions or overwrites another transaction's pending marker. func (l Ledger) MigrationCensus(ctx context.Context, want Census, verifyOnly bool) error { unlock, err := l.State.Lock(ctx, "transaction.lock") if err != nil { return err } defer unlock() raw, err := l.State.Read("census.json") if err == nil { var c Census if Decode(raw, &c) != nil || c.Schema != 1 || c.Box != want.Box || c.Enrollment != want.Enrollment || c.Migration != want.Migration || c.NeverEnrolled || c.Revision == 0 || c.LaunchRevision == 0 { return ErrUnavailable } if c.Complete && c.Pending == "" { return nil } if verifyOnly || c.Pending != "migration" { return ErrUnavailable } want.Revision = c.Revision want.LaunchRevision = c.LaunchRevision } else if !errors.Is(err, os.ErrNotExist) { return err } else if verifyOnly { return ErrUnavailable } if err := l.writeCensus(want); err != nil { if want.Complete { want.Complete = false want.Pending = "migration" return errors.Join(err, l.writeCensus(want)) } return err } return nil }