Read blob sizes only for selected validation inputs
This commit is contained in:
@@ -163,8 +163,9 @@ func CommittedPaths(repositoryDir, commit string) PathResolver {
|
||||
}
|
||||
}
|
||||
|
||||
// ReadTree enumerates all entries in a commit and records blob sizes. Paths
|
||||
// are NUL-delimited by Git so whitespace in a filename is preserved.
|
||||
// ReadTree enumerates path, type, mode, and object metadata for a commit.
|
||||
// Blob sizes and contents are inspected separately. Paths are NUL-delimited
|
||||
// by Git so whitespace in a filename is preserved.
|
||||
func ReadTree(ctx context.Context, repositoryDir, commit string) ([]TreeEntry, error) {
|
||||
if !validObjectID(commit) {
|
||||
return nil, fmt.Errorf("invalid commit object ID %q", commit)
|
||||
@@ -177,9 +178,6 @@ func ReadTree(ctx context.Context, repositoryDir, commit string) ([]TreeEntry, e
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("parse committed tree %s: %w", commit, err)
|
||||
}
|
||||
if err := populateBlobSizes(ctx, repositoryDir, entries); err != nil {
|
||||
return nil, fmt.Errorf("read committed blob sizes for %s: %w", commit, err)
|
||||
}
|
||||
return entries, nil
|
||||
}
|
||||
|
||||
@@ -223,11 +221,16 @@ func parseTreeEntries(output []byte) ([]TreeEntry, error) {
|
||||
return entries, nil
|
||||
}
|
||||
|
||||
func populateBlobSizes(ctx context.Context, repositoryDir string, entries []TreeEntry) error {
|
||||
// PopulateBlobSizes fills unknown sizes for the supplied blob entries using
|
||||
// local objects. Callers select the entries whose sizes their check needs.
|
||||
func PopulateBlobSizes(ctx context.Context, repositoryDir string, entries []TreeEntry) error {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
var blobIndexes []int
|
||||
var input strings.Builder
|
||||
for index := range entries {
|
||||
if entries[index].Type != "blob" {
|
||||
if entries[index].Type != "blob" || entries[index].HasSize {
|
||||
continue
|
||||
}
|
||||
blobIndexes = append(blobIndexes, index)
|
||||
@@ -250,7 +253,7 @@ func populateBlobSizes(ctx context.Context, repositoryDir string, entries []Tree
|
||||
fields := strings.Fields(line)
|
||||
entry := &entries[blobIndexes[index]]
|
||||
if len(fields) == 2 && fields[0] == entry.ObjectID && fields[1] == "missing" {
|
||||
return fmt.Errorf("committed blob %s is unavailable locally", entry.ObjectID)
|
||||
return fmt.Errorf("committed blob %s for %q is unavailable locally", entry.ObjectID, entry.Path)
|
||||
}
|
||||
if len(fields) != 3 || fields[0] != entry.ObjectID || fields[1] != "blob" {
|
||||
return fmt.Errorf("unexpected blob size record %q", line)
|
||||
|
||||
Reference in New Issue
Block a user