| 13 | ) |
| 14 | |
| 15 | func Diff(ctx context.Context, dir, name string, opts *Options) error { |
| 16 | stderr := opts.Stderr |
| 17 | output, err := Generate(ctx, dir, name, opts) |
| 18 | if err != nil { |
| 19 | return err |
| 20 | } |
| 21 | defer trace.StartRegion(ctx, "checkfiles").End() |
| 22 | var errored bool |
| 23 | |
| 24 | keys := make([]string, 0, len(output)) |
| 25 | for k, _ := range output { |
| 26 | kk := k |
| 27 | keys = append(keys, kk) |
| 28 | } |
| 29 | sort.Strings(keys) |
| 30 | |
| 31 | for _, filename := range keys { |
| 32 | source := output[filename] |
| 33 | if _, err := os.Stat(filename); errors.Is(err, os.ErrNotExist) { |
| 34 | errored = true |
| 35 | // stdout message |
| 36 | continue |
| 37 | } |
| 38 | existing, err := os.ReadFile(filename) |
| 39 | if err != nil { |
| 40 | errored = true |
| 41 | fmt.Fprintf(stderr, "%s: %s\n", filename, err) |
| 42 | continue |
| 43 | } |
| 44 | diff := gonp.New(getLines(existing), getLines([]byte(source))) |
| 45 | diff.Compose() |
| 46 | uniHunks := filterHunks(diff.UnifiedHunks()) |
| 47 | |
| 48 | if len(uniHunks) > 0 { |
| 49 | errored = true |
| 50 | fmt.Fprintf(stderr, "--- a%s\n", strings.TrimPrefix(filename, dir)) |
| 51 | fmt.Fprintf(stderr, "+++ b%s\n", strings.TrimPrefix(filename, dir)) |
| 52 | diff.FprintUniHunks(stderr, uniHunks) |
| 53 | } |
| 54 | } |
| 55 | if errored { |
| 56 | return errors.New("diff found") |
| 57 | } |
| 58 | return nil |
| 59 | } |