# Match git fsck error lines by prefix in --check

`1c8caf7`→[main](/content/gh/entireio/git-sync/commits/main/index.html)·

nodo·1mo ago·1 file·+22 added/-1 removed

Substring-matching "error" against the full fsck output could
false-positive on benign dangling/warning lines that happened
to contain that word (e.g. a branch or path with "error" in
it). Scan line-by-line for "error:" / "fatal:" / "missing "
/ "broken link" / "bad " prefixes, which is what git itself
uses to signal real problems.

## Sessions

Transcript data is unavailable for this checkpoint.

## Changes

1

- cmd/git-sync/internal/sha256convert

- Msha256convert.go+22/-1

```
557 unmodified lines

560
561
562
563
564
565
566
567
568
569
570
1 unmodified line

573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592

557 unmodified lines

switch {
	case err != nil:
		checks = append(checks, Check{Name: "git fsck --full", OK: false, Detail: fmt.Sprintf("%v\n%s", err, fsckOut)})
	case bytes.Contains(fsckOut, []byte("error")) || bytes.Contains(fsckOut, []byte("bad sha")):
	case fsckHasError(fsckOut):
		// Belt-and-braces against a hypothetical git version that prints
		// "error:" / "fatal:" lines but exits zero. Match line prefixes
		// rather than a substring so a branch or path containing "error"
		// in a benign dangling/warning line doesn't trip the check.
		checks = append(checks, Check{Name: "git fsck --full", OK: false, Detail: strings.TrimSpace(string(fsckOut))})
	default:
		checks = append(checks, Check{Name: "git fsck --full", OK: true, Detail: "clean"})
	1 unmodified line

return checks
}

// fsckHasError reports whether git-fsck output contains a line that signals
// a real problem (an "error:" or "fatal:" prefix, or a "missing"/"bad"
// object report). Dangling and warning lines are ignored.
func fsckHasError(out []byte) bool {
	scanner := bufio.NewScanner(bytes.NewReader(out))
	for scanner.Scan() {
		line := strings.TrimSpace(scanner.Text())
		if strings.HasPrefix(line, "error:") || strings.HasPrefix(line, "fatal:") {
			return true
		}
		if strings.HasPrefix(line, "missing ") || strings.HasPrefix(line, "broken link") || strings.HasPrefix(line, "bad ") {
			return true
		}
	}
	return false
}

const (
	originNotesRef       = "refs/notes/sha1-origin"
	attestationTagPrefix = "refs/tags/converted/"
```
