Drop progress reporting from banner tracker reset
The ResetProgressFunc callback streamed per-phase messages from inside the reset transaction, so a rollback could leave already-printed progress describing work that never committed. Remove the callback entirely; the final result summary printed by proboctl still conveys the outcome without the misleading intermediate output. Signed-off-by: Émile Ré <emile@probo.com>
This commit is contained in:
@@ -33,21 +33,6 @@ type ResetTrackersResult struct {
|
|||||||
AnalysisRequested bool
|
AnalysisRequested bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResetProgressFunc receives human-readable progress messages emitted as
|
|
||||||
// a banner reset advances through its phases. It is optional: pass nil to
|
|
||||||
// run silently. Messages are emitted inside the reset transaction, so a
|
|
||||||
// later failure that rolls the transaction back may leave already-printed
|
|
||||||
// progress describing work that did not commit.
|
|
||||||
type ResetProgressFunc func(message string)
|
|
||||||
|
|
||||||
func (p ResetProgressFunc) report(format string, args ...any) {
|
|
||||||
if p == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
p(fmt.Sprintf(format, args...))
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResetBannerTrackers re-arms the tracker pipeline for a banner's
|
// ResetBannerTrackers re-arms the tracker pipeline for a banner's
|
||||||
// uncategorised, non-excluded patterns. It is an operator action
|
// uncategorised, non-excluded patterns. It is an operator action
|
||||||
// (proboctl), tenant-scoped via the provided Scoper.
|
// (proboctl), tenant-scoped via the provided Scoper.
|
||||||
@@ -70,9 +55,6 @@ func (p ResetProgressFunc) report(format string, args ...any) {
|
|||||||
// whose pattern or display name contains it (case-insensitive): only
|
// whose pattern or display name contains it (case-insensitive): only
|
||||||
// matching globs are decomposed and only matching patterns are re-armed
|
// matching globs are decomposed and only matching patterns are re-armed
|
||||||
// for mapping. The banner-wide pattern-analysis re-arm is unaffected.
|
// for mapping. The banner-wide pattern-analysis re-arm is unaffected.
|
||||||
//
|
|
||||||
// progress receives human-readable phase updates as the reset runs; pass
|
|
||||||
// nil to run silently.
|
|
||||||
func ResetBannerTrackers(
|
func ResetBannerTrackers(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
pgClient *pg.Client,
|
pgClient *pg.Client,
|
||||||
@@ -80,28 +62,23 @@ func ResetBannerTrackers(
|
|||||||
bannerID gid.GID,
|
bannerID gid.GID,
|
||||||
mappingOnly bool,
|
mappingOnly bool,
|
||||||
keyword *string,
|
keyword *string,
|
||||||
progress ResetProgressFunc,
|
|
||||||
) (ResetTrackersResult, error) {
|
) (ResetTrackersResult, error) {
|
||||||
var result ResetTrackersResult
|
var result ResetTrackersResult
|
||||||
|
|
||||||
err := pgClient.WithTx(
|
err := pgClient.WithTx(
|
||||||
ctx,
|
ctx,
|
||||||
func(ctx context.Context, tx pg.Tx) error {
|
func(ctx context.Context, tx pg.Tx) error {
|
||||||
progress.report("Loading uncategorised category for banner %s...", bannerID)
|
|
||||||
|
|
||||||
var uncategorised coredata.CookieCategory
|
var uncategorised coredata.CookieCategory
|
||||||
if err := uncategorised.LoadUncategorisedByCookieBannerID(ctx, tx, scope, bannerID); err != nil {
|
if err := uncategorised.LoadUncategorisedByCookieBannerID(ctx, tx, scope, bannerID); err != nil {
|
||||||
return fmt.Errorf("cannot load uncategorised category: %w", err)
|
return fmt.Errorf("cannot load uncategorised category: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !mappingOnly {
|
if !mappingOnly {
|
||||||
if err := decomposeGlobs(ctx, tx, scope, bannerID, uncategorised.ID, keyword, &result, progress); err != nil {
|
if err := decomposeGlobs(ctx, tx, scope, bannerID, uncategorised.ID, keyword, &result); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.report("Resetting links and re-arming mapping on matching patterns...")
|
|
||||||
|
|
||||||
var patterns coredata.TrackerPatterns
|
var patterns coredata.TrackerPatterns
|
||||||
|
|
||||||
reset, err := patterns.ResetAndRequestMappingByCookieCategoryID(ctx, tx, scope, uncategorised.ID, keyword)
|
reset, err := patterns.ResetAndRequestMappingByCookieCategoryID(ctx, tx, scope, uncategorised.ID, keyword)
|
||||||
@@ -111,11 +88,7 @@ func ResetBannerTrackers(
|
|||||||
|
|
||||||
result.PatternsReset = reset
|
result.PatternsReset = reset
|
||||||
|
|
||||||
progress.report("Reset %d pattern(s) and re-armed mapping.", reset)
|
|
||||||
|
|
||||||
if !mappingOnly {
|
if !mappingOnly {
|
||||||
progress.report("Re-arming pattern analysis on banner %s...", bannerID)
|
|
||||||
|
|
||||||
banner := coredata.CookieBanner{ID: bannerID}
|
banner := coredata.CookieBanner{ID: bannerID}
|
||||||
if err := banner.SetPatternAnalysisRequested(ctx, tx); err != nil {
|
if err := banner.SetPatternAnalysisRequested(ctx, tx); err != nil {
|
||||||
return fmt.Errorf("cannot request pattern analysis: %w", err)
|
return fmt.Errorf("cannot request pattern analysis: %w", err)
|
||||||
@@ -145,7 +118,6 @@ func decomposeGlobs(
|
|||||||
uncategorisedID gid.GID,
|
uncategorisedID gid.GID,
|
||||||
keyword *string,
|
keyword *string,
|
||||||
result *ResetTrackersResult,
|
result *ResetTrackersResult,
|
||||||
progress ResetProgressFunc,
|
|
||||||
) error {
|
) error {
|
||||||
globMatchType := coredata.TrackerPatternMatchTypeGlob
|
globMatchType := coredata.TrackerPatternMatchTypeGlob
|
||||||
notExcluded := false
|
notExcluded := false
|
||||||
@@ -162,16 +134,12 @@ func decomposeGlobs(
|
|||||||
return fmt.Errorf("cannot load glob patterns: %w", err)
|
return fmt.Errorf("cannot load glob patterns: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.report("Decomposing %d glob pattern(s) into exact patterns...", len(globs))
|
for _, glob := range globs {
|
||||||
|
|
||||||
for i, glob := range globs {
|
|
||||||
var detections coredata.DetectedTrackers
|
var detections coredata.DetectedTrackers
|
||||||
if err := detections.LoadAllByTrackerPatternID(ctx, tx, scope, glob.ID); err != nil {
|
if err := detections.LoadAllByTrackerPatternID(ctx, tx, scope, glob.ID); err != nil {
|
||||||
return fmt.Errorf("cannot load detections for glob %q: %w", glob.Pattern, err)
|
return fmt.Errorf("cannot load detections for glob %q: %w", glob.Pattern, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.report("[%d/%d] Decomposing glob %q (%d detection(s))...", i+1, len(globs), glob.Pattern, len(detections))
|
|
||||||
|
|
||||||
for _, detection := range detections {
|
for _, detection := range detections {
|
||||||
exactID, created, err := ensureExactPattern(ctx, tx, scope, glob, uncategorisedID, detection)
|
exactID, created, err := ensureExactPattern(ctx, tx, scope, glob, uncategorisedID, detection)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ func TestResetBannerTrackers_FullRebuild(t *testing.T) {
|
|||||||
return nil
|
return nil
|
||||||
}))
|
}))
|
||||||
|
|
||||||
result, err := ResetBannerTrackers(ctx, client, fx.scope, fx.banner.ID, false, nil, nil)
|
result, err := ResetBannerTrackers(ctx, client, fx.scope, fx.banner.ID, false, nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, 1, result.GlobsDecomposed)
|
require.Equal(t, 1, result.GlobsDecomposed)
|
||||||
|
|||||||
@@ -89,11 +89,7 @@ func newCmdResetTrackers(f *cmdutil.Factory) *cobra.Command {
|
|||||||
|
|
||||||
_, _ = fmt.Fprintf(out, "Running %s on banner %s.\n", mode, bannerID.String())
|
_, _ = fmt.Fprintf(out, "Running %s on banner %s.\n", mode, bannerID.String())
|
||||||
|
|
||||||
progress := func(message string) {
|
result, err := cookiebanner.ResetBannerTrackers(ctx, pgClient, scope, bannerID, flagMappingOnly, keyword)
|
||||||
_, _ = fmt.Fprintf(out, " %s\n", message)
|
|
||||||
}
|
|
||||||
|
|
||||||
result, err := cookiebanner.ResetBannerTrackers(ctx, pgClient, scope, bannerID, flagMappingOnly, keyword, progress)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot reset banner %s: %w", bannerID, err)
|
return fmt.Errorf("cannot reset banner %s: %w", bannerID, err)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user