git: pass Git environment to object scanner

Currently, we only need the operating system environment to pass to the
object scanner, but when we start processing SHA-256 repositories, we'll
also need to know about the Git configuration as well to determine the
extensions.objectFormat value (which specifies the hash algorithm).
Let's pass the Git environment, as well as the OS environment, down to
our object scanner.
This commit is contained in:
brian m. carlson 2020-05-15 18:58:37 +00:00
parent d36280d782
commit 412f582706
No known key found for this signature in database
GPG Key ID: 2D0C9BC12F82B3A1
9 changed files with 29 additions and 29 deletions

@ -99,7 +99,7 @@ func checkoutConflict(file string, stage git.IndexStage) {
Exit("Could not checkout (are you not in the middle of a merge?): %v", err)
}
scanner, err := git.NewObjectScanner(cfg.OSEnv())
scanner, err := git.NewObjectScanner(cfg.GitEnv(), cfg.OSEnv())
if err != nil {
Exit("Could not create object scanner: %v", err)
}

@ -33,7 +33,7 @@ func statusCommand(cmd *cobra.Command, args []string) {
scanIndexAt = git.RefBeforeFirstCommit
}
scanner, err := lfs.NewPointerScanner(cfg.OSEnv())
scanner, err := lfs.NewPointerScanner(cfg.GitEnv(), cfg.OSEnv())
if err != nil {
ExitWithError(err)
}

@ -42,7 +42,7 @@ type ObjectScanner struct {
// command, they will be returned immediately.
//
// Otherwise, an `*ObjectScanner` is returned with no error.
func NewObjectScanner(osEnv Environment) (*ObjectScanner, error) {
func NewObjectScanner(gitEnv, osEnv Environment) (*ObjectScanner, error) {
gitdir, err := GitCommonDir()
if err != nil {
return nil, err

@ -92,7 +92,7 @@ func (s *GitScanner) ScanRangeToRemote(left, right string, cb GitScannerFoundPoi
}
s.mu.Unlock()
return scanLeftRightToChan(s, callback, left, right, s.cfg.OSEnv(), s.opts(ScanRangeToRemoteMode))
return scanLeftRightToChan(s, callback, left, right, s.cfg.GitEnv(), s.cfg.OSEnv(), s.opts(ScanRangeToRemoteMode))
}
// ScanMultiRangeToRemote scans through all commits starting at the left ref but
@ -111,7 +111,7 @@ func (s *GitScanner) ScanMultiRangeToRemote(left string, rights []string, cb Git
}
s.mu.Unlock()
return scanMultiLeftRightToChan(s, callback, left, rights, s.cfg.OSEnv(), s.opts(ScanRangeToRemoteMode))
return scanMultiLeftRightToChan(s, callback, left, rights, s.cfg.GitEnv(), s.cfg.OSEnv(), s.opts(ScanRangeToRemoteMode))
}
// ScanRefs through all commits reachable by refs contained in "include" and
@ -124,7 +124,7 @@ func (s *GitScanner) ScanRefs(include, exclude []string, cb GitScannerFoundPoint
opts := s.opts(ScanRefsMode)
opts.SkipDeletedBlobs = false
return scanRefsToChan(s, callback, include, exclude, s.cfg.OSEnv(), opts)
return scanRefsToChan(s, callback, include, exclude, s.cfg.GitEnv(), s.cfg.OSEnv(), opts)
}
// ScanRefRange scans through all commits from the given left and right refs,
@ -137,7 +137,7 @@ func (s *GitScanner) ScanRefRange(left, right string, cb GitScannerFoundPointer)
opts := s.opts(ScanRefsMode)
opts.SkipDeletedBlobs = false
return scanLeftRightToChan(s, callback, left, right, s.cfg.OSEnv(), opts)
return scanLeftRightToChan(s, callback, left, right, s.cfg.GitEnv(), s.cfg.OSEnv(), opts)
}
// ScanRefWithDeleted scans through all objects in the given ref, including
@ -156,7 +156,7 @@ func (s *GitScanner) ScanRef(ref string, cb GitScannerFoundPointer) error {
opts := s.opts(ScanRefsMode)
opts.SkipDeletedBlobs = true
return scanLeftRightToChan(s, callback, ref, "", s.cfg.OSEnv(), opts)
return scanLeftRightToChan(s, callback, ref, "", s.cfg.GitEnv(), s.cfg.OSEnv(), opts)
}
// ScanAll scans through all objects in the git repository.
@ -168,7 +168,7 @@ func (s *GitScanner) ScanAll(cb GitScannerFoundPointer) error {
opts := s.opts(ScanAllMode)
opts.SkipDeletedBlobs = false
return scanLeftRightToChan(s, callback, "", "", s.cfg.OSEnv(), opts)
return scanLeftRightToChan(s, callback, "", "", s.cfg.GitEnv(), s.cfg.OSEnv(), opts)
}
// ScanTree takes a ref and returns WrappedPointer objects in the tree at that
@ -179,7 +179,7 @@ func (s *GitScanner) ScanTree(ref string) error {
if err != nil {
return err
}
return runScanTree(callback, ref, s.Filter, s.cfg.OSEnv())
return runScanTree(callback, ref, s.Filter, s.cfg.GitEnv(), s.cfg.OSEnv())
}
// ScanUnpushed scans history for all LFS pointers which have been added but not
@ -210,7 +210,7 @@ func (s *GitScanner) ScanIndex(ref string, cb GitScannerFoundPointer) error {
if err != nil {
return err
}
return scanIndex(callback, ref, s.Filter, s.cfg.OSEnv())
return scanIndex(callback, ref, s.Filter, s.cfg.GitEnv(), s.cfg.OSEnv())
}
func (s *GitScanner) opts(mode ScanningMode) *ScanRefsOptions {

@ -17,8 +17,8 @@ import (
// 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.
func runCatFileBatch(pointerCh chan *WrappedPointer, lockableCh chan string, lockableSet *lockableNameSet, revs *StringChannelWrapper, errCh chan error, osEnv config.Environment) error {
scanner, err := NewPointerScanner(osEnv)
func runCatFileBatch(pointerCh chan *WrappedPointer, lockableCh chan string, lockableSet *lockableNameSet, revs *StringChannelWrapper, errCh chan error, gitEnv, osEnv config.Environment) error {
scanner, err := NewPointerScanner(gitEnv, osEnv)
if err != nil {
return err
}
@ -70,8 +70,8 @@ type PointerScanner struct {
err error
}
func NewPointerScanner(osEnv config.Environment) (*PointerScanner, error) {
scanner, err := git.NewObjectScanner(osEnv)
func NewPointerScanner(gitEnv, osEnv config.Environment) (*PointerScanner, error) {
scanner, err := git.NewObjectScanner(gitEnv, osEnv)
if err != nil {
return nil, err
}

@ -13,7 +13,7 @@ import (
//
// Ref is the ref at which to scan, which may be "HEAD" if there is at least one
// commit.
func scanIndex(cb GitScannerFoundPointer, ref string, f *filepathfilter.Filter, osEnv config.Environment) error {
func scanIndex(cb GitScannerFoundPointer, ref string, f *filepathfilter.Filter, gitEnv, osEnv config.Environment) error {
indexMap := &indexFileMap{
nameMap: make(map[string][]*indexFile),
nameShaPairs: make(map[string]bool),
@ -68,7 +68,7 @@ func scanIndex(cb GitScannerFoundPointer, ref string, f *filepathfilter.Filter,
ch := make(chan gitscannerResult, chanBufSize)
barePointerCh, _, err := catFileBatch(smallShas, nil, osEnv)
barePointerCh, _, err := catFileBatch(smallShas, nil, gitEnv, osEnv)
if err != nil {
return err
}

@ -38,7 +38,7 @@ func noopFoundLockable(name string) {}
// "include" and not reachable by any refs included in "excluded" and returns
// a channel of WrappedPointer objects for all Git LFS pointers it finds.
// Reports unique oids once only, not multiple times if >1 file uses the same content
func scanRefsToChan(scanner *GitScanner, pointerCb GitScannerFoundPointer, include, exclude []string, osEnv config.Environment, opt *ScanRefsOptions) error {
func scanRefsToChan(scanner *GitScanner, pointerCb GitScannerFoundPointer, include, exclude []string, gitEnv, osEnv config.Environment, opt *ScanRefsOptions) error {
if opt == nil {
panic("no scan ref options")
}
@ -65,7 +65,7 @@ func scanRefsToChan(scanner *GitScanner, pointerCb GitScannerFoundPointer, inclu
}
}(lockableCb, batchLockableCh)
pointers, checkLockableCh, err := catFileBatch(smallShas, lockableSet, osEnv)
pointers, checkLockableCh, err := catFileBatch(smallShas, lockableSet, gitEnv, osEnv)
if err != nil {
return err
}
@ -96,16 +96,16 @@ func scanRefsToChan(scanner *GitScanner, pointerCb GitScannerFoundPointer, inclu
// scanLeftRightToChan takes a ref and returns a channel of WrappedPointer objects
// for all Git LFS pointers it finds for that ref.
// Reports unique oids once only, not multiple times if >1 file uses the same content
func scanLeftRightToChan(scanner *GitScanner, pointerCb GitScannerFoundPointer, refLeft, refRight string, osEnv config.Environment, opt *ScanRefsOptions) error {
return scanRefsToChan(scanner, pointerCb, []string{refLeft}, []string{refRight}, osEnv, opt)
func scanLeftRightToChan(scanner *GitScanner, pointerCb GitScannerFoundPointer, refLeft, refRight string, gitEnv, osEnv config.Environment, opt *ScanRefsOptions) error {
return scanRefsToChan(scanner, pointerCb, []string{refLeft}, []string{refRight}, gitEnv, osEnv, opt)
}
// scanMultiLeftRightToChan takes a ref and a set of bases and returns a channel
// of WrappedPointer objects for all Git LFS pointers it finds for that ref.
// Reports unique oids once only, not multiple times if >1 file uses the same
// content
func scanMultiLeftRightToChan(scanner *GitScanner, pointerCb GitScannerFoundPointer, refLeft string, bases []string, osEnv config.Environment, opt *ScanRefsOptions) error {
return scanRefsToChan(scanner, pointerCb, []string{refLeft}, bases, osEnv, opt)
func scanMultiLeftRightToChan(scanner *GitScanner, pointerCb GitScannerFoundPointer, refLeft string, bases []string, gitEnv, osEnv config.Environment, opt *ScanRefsOptions) error {
return scanRefsToChan(scanner, pointerCb, []string{refLeft}, bases, gitEnv, osEnv, opt)
}
// revListShas uses git rev-list to return the list of object sha1s

@ -20,7 +20,7 @@ type TreeBlob struct {
Filename string
}
func runScanTree(cb GitScannerFoundPointer, ref string, filter *filepathfilter.Filter, osEnv config.Environment) error {
func runScanTree(cb GitScannerFoundPointer, ref string, filter *filepathfilter.Filter, gitEnv, osEnv config.Environment) error {
// We don't use the nameMap approach here since that's imprecise when >1 file
// can be using the same content
treeShas, err := lsTreeBlobs(ref, filter)
@ -28,7 +28,7 @@ func runScanTree(cb GitScannerFoundPointer, ref string, filter *filepathfilter.F
return err
}
pcw, err := catFileBatchTree(treeShas, osEnv)
pcw, err := catFileBatchTree(treeShas, gitEnv, osEnv)
if err != nil {
return err
}
@ -47,8 +47,8 @@ func runScanTree(cb GitScannerFoundPointer, ref string, filter *filepathfilter.F
// of a git object, given its sha1. The contents will be decoded into
// a Git LFS pointer. treeblobs is a channel over which blob entries
// will be sent. It returns a channel from which point.Pointers can be read.
func catFileBatchTree(treeblobs *TreeBlobChannelWrapper, osEnv config.Environment) (*PointerChannelWrapper, error) {
scanner, err := NewPointerScanner(osEnv)
func catFileBatchTree(treeblobs *TreeBlobChannelWrapper, gitEnv, osEnv config.Environment) (*PointerChannelWrapper, error) {
scanner, err := NewPointerScanner(gitEnv, osEnv)
if err != nil {
return nil, err
}

@ -48,11 +48,11 @@ func catFileBatchCheck(revs *StringChannelWrapper, lockableSet *lockableNameSet)
// of a git object, given its sha1. The contents will be decoded into
// a Git LFS pointer. revs is a channel over which strings containing Git SHA1s
// will be sent. It returns a channel from which point.Pointers can be read.
func catFileBatch(revs *StringChannelWrapper, lockableSet *lockableNameSet, osEnv config.Environment) (*PointerChannelWrapper, chan string, error) {
func catFileBatch(revs *StringChannelWrapper, lockableSet *lockableNameSet, gitEnv, osEnv config.Environment) (*PointerChannelWrapper, chan string, error) {
pointerCh := make(chan *WrappedPointer, chanBufSize)
lockableCh := make(chan string, chanBufSize)
errCh := make(chan error, 5) // shared by 2 goroutines & may add more detail errors?
if err := runCatFileBatch(pointerCh, lockableCh, lockableSet, revs, errCh, osEnv); err != nil {
if err := runCatFileBatch(pointerCh, lockableCh, lockableSet, revs, errCh, gitEnv, osEnv); err != nil {
return nil, nil, err
}
return NewPointerChannelWrapper(pointerCh, errCh), lockableCh, nil