| 121 | var regexpBatchCheckObject = regexp.MustCompile(`^([0-9a-f]{40,64}) (\w+) (\d+)$`) |
| 122 | |
| 123 | func CatFileBatchCheckAllObjects(r io.Reader) ([]BatchCheckObject, error) { |
| 124 | var result []BatchCheckObject |
| 125 | |
| 126 | scan := bufio.NewScanner(r) |
| 127 | scan.Split(ScanZeroSeparated) |
| 128 | |
| 129 | for scan.Scan() { |
| 130 | line := scan.Text() |
| 131 | matches := regexpBatchCheckObject.FindStringSubmatch(line) |
| 132 | |
| 133 | if len(matches) != 4 { |
| 134 | return nil, fmt.Errorf("failed to parse line: %q", line) |
| 135 | } |
| 136 | |
| 137 | sha, err := sha.New(matches[1]) |
| 138 | if err != nil { |
| 139 | return nil, fmt.Errorf("failed to create sha.SHA for %q: %w", matches[1], err) |
| 140 | } |
| 141 | |
| 142 | sizeStr := matches[3] |
| 143 | size, err := strconv.ParseInt(sizeStr, 10, 64) |
| 144 | if err != nil { |
| 145 | return nil, fmt.Errorf("failed to convert size %q to int64: %w", sizeStr, err) |
| 146 | } |
| 147 | |
| 148 | result = append(result, BatchCheckObject{ |
| 149 | SHA: sha, |
| 150 | Type: matches[2], |
| 151 | Size: size, |
| 152 | }) |
| 153 | } |
| 154 | if err := scan.Err(); err != nil { |
| 155 | return nil, fmt.Errorf("failed to scan cat file batch check all objects: %w", scan.Err()) |
| 156 | } |
| 157 | |
| 158 | return result, nil |
| 159 | } |