code: func runCatFileBatch(pointerCh chan *WrappedPointer, lockableCh chan string, lockableSet *lockableNameSet, revs *StringChannelWrapper, errCh chan error) error {
  	scanner, err := NewPointerScanner()
  	if err != nil {
  		return err
  	}
  
  	go func() {
  		canScan := true
  		for r := range revs.Results {
  			canScan = scanner.Scan(r)
  
  			if err := scanner.Err(); err != nil {
  				errCh <- err
  			} else if p := scanner.Pointer(); p != nil {
  				pointerCh <- p
  			} else if b := scanner.BlobSHA(); len(b) == 40 {
  				if name, ok := lockableSet.Check(b); ok {
  					lockableCh <- name
  				}
  			}
  
  			if !canScan {
  				break
  			}
  		}
  
  		if canScan {
  			if err := revs.Wait(); err != nil {
  				errCh <- err
  			}
  		}
  
  		if err := scanner.Close(); err != nil {
  			errCh <- err
  		}
  
  		close(pointerCh)
  		close(errCh)
  		close(lockableCh)
  	}()
  
  	return nil
  }
docs: // runCatFileBatch uses 'git cat-file --batch' to get the object contents of a
  // git object, given its sha1. The contents will be decoded into a Git LFS
  // pointer. Git Blob SHA1s are read from the sha1Ch channel and fed to STDIN.
  // Results are parsed from STDOUT, and any eligible LFS pointers are sent to
  // pointerCh. If a Git Blob is not an LFS pointer, check the lockableSet to see
  // if that blob is for a locked file. Any errors are sent to errCh. An error is
  // returned if the 'git cat-file' command fails to start.