extract ScanPreviousVersions
This commit is contained in:
parent
4051dc0211
commit
7a2cbefaa7
@ -322,7 +322,8 @@ func pruneTaskGetRetainedAtRef(ref string, retainChan chan string, errorChan cha
|
||||
func pruneTaskGetPreviousVersionsOfRef(ref string, since time.Time, retainChan chan string, errorChan chan error, waitg *sync.WaitGroup) {
|
||||
defer waitg.Done()
|
||||
|
||||
refchan, err := lfs.ScanPreviousVersionsToChan(ref, since)
|
||||
gitscanner := lfs.NewGitScanner()
|
||||
refchan, err := gitscanner.ScanPreviousVersions(ref, since)
|
||||
if err != nil {
|
||||
errorChan <- err
|
||||
return
|
||||
|
@ -1,6 +1,9 @@
|
||||
package lfs
|
||||
|
||||
import "fmt"
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// GitScanner scans objects in a Git repository for LFS pointers.
|
||||
type GitScanner struct {
|
||||
@ -65,6 +68,14 @@ func (s *GitScanner) ScanUnpushed(remote string) (*PointerChannelWrapper, error)
|
||||
return scanUnpushed(remote)
|
||||
}
|
||||
|
||||
// ScanPreviousVersions scans changes reachable from ref (commit) back to since.
|
||||
// Returns channel of pointers for *previous* versions that overlap that time.
|
||||
// Does not include pointers which were still in use at ref (use ScanRefsToChan
|
||||
// for that)
|
||||
func (s *GitScanner) ScanPreviousVersions(ref string, since time.Time) (*PointerChannelWrapper, error) {
|
||||
return logPreviousSHAs(ref, since)
|
||||
}
|
||||
|
||||
func (s *GitScanner) opts(mode ScanningMode) *ScanRefsOptions {
|
||||
opts := newScanRefsOptions()
|
||||
opts.ScanMode = mode
|
||||
|
@ -7,7 +7,9 @@ import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
"github.com/git-lfs/git-lfs/git"
|
||||
"github.com/git-lfs/git-lfs/tools"
|
||||
"github.com/rubyist/tracerx"
|
||||
)
|
||||
@ -70,6 +72,44 @@ func scanUnpushed(remote string) (*PointerChannelWrapper, error) {
|
||||
return NewPointerChannelWrapper(pchan, errchan), nil
|
||||
}
|
||||
|
||||
// logPreviousVersions scans history for all previous versions of LFS pointers
|
||||
// from 'since' up to (but not including) the final state at ref
|
||||
func logPreviousSHAs(ref string, since time.Time) (*PointerChannelWrapper, error) {
|
||||
logArgs := []string{"log",
|
||||
fmt.Sprintf("--since=%v", git.FormatGitDate(since)),
|
||||
}
|
||||
// Add standard search args to find lfs references
|
||||
logArgs = append(logArgs, logLfsSearchArgs...)
|
||||
// ending at ref
|
||||
logArgs = append(logArgs, ref)
|
||||
|
||||
cmd, err := startCommand("git", logArgs...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cmd.Stdin.Close()
|
||||
|
||||
pchan := make(chan *WrappedPointer, chanBufSize)
|
||||
errchan := make(chan error, 1)
|
||||
|
||||
// we pull out deletions, since we want the previous SHAs at commits in the range
|
||||
// this means we pick up all previous versions that could have been checked
|
||||
// out in the date range, not just if the commit which *introduced* them is in the range
|
||||
go func() {
|
||||
parseLogOutputToPointers(cmd.Stdout, LogDiffDeletions, nil, nil, pchan)
|
||||
stderr, _ := ioutil.ReadAll(cmd.Stderr)
|
||||
err := cmd.Wait()
|
||||
if err != nil {
|
||||
errchan <- fmt.Errorf("Error in git log: %v %v", err, string(stderr))
|
||||
}
|
||||
close(pchan)
|
||||
close(errchan)
|
||||
}()
|
||||
|
||||
return NewPointerChannelWrapper(pchan, errchan), nil
|
||||
}
|
||||
|
||||
// parseLogOutputToPointers parses log output formatted as per logLfsSearchArgs & return pointers
|
||||
// log: a stream of output from git log with at least logLfsSearchArgs specified
|
||||
// dir: whether to include results from + or - diffs
|
||||
|
@ -14,7 +14,6 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/git-lfs/git-lfs/git"
|
||||
"github.com/rubyist/tracerx"
|
||||
)
|
||||
|
||||
@ -715,7 +714,8 @@ func ScanPreviousVersions(ref string, since time.Time) ([]*WrappedPointer, error
|
||||
tracerx.PerformanceSince("scan", start)
|
||||
}()
|
||||
|
||||
pointerchan, err := ScanPreviousVersionsToChan(ref, since)
|
||||
gitscanner := NewGitScanner()
|
||||
pointerchan, err := gitscanner.ScanPreviousVersions(ref, since)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -728,52 +728,6 @@ func ScanPreviousVersions(ref string, since time.Time) ([]*WrappedPointer, error
|
||||
|
||||
}
|
||||
|
||||
// ScanPreviousVersionsToChan scans changes reachable from ref (commit) back to since.
|
||||
// Returns channel of pointers for *previous* versions that overlap that time. Does not
|
||||
// include pointers which were still in use at ref (use ScanRefsToChan for that)
|
||||
func ScanPreviousVersionsToChan(ref string, since time.Time) (*PointerChannelWrapper, error) {
|
||||
return logPreviousSHAs(ref, since)
|
||||
}
|
||||
|
||||
// logPreviousVersions scans history for all previous versions of LFS pointers
|
||||
// from 'since' up to (but not including) the final state at ref
|
||||
func logPreviousSHAs(ref string, since time.Time) (*PointerChannelWrapper, error) {
|
||||
logArgs := []string{"log",
|
||||
fmt.Sprintf("--since=%v", git.FormatGitDate(since)),
|
||||
}
|
||||
// Add standard search args to find lfs references
|
||||
logArgs = append(logArgs, logLfsSearchArgs...)
|
||||
// ending at ref
|
||||
logArgs = append(logArgs, ref)
|
||||
|
||||
cmd, err := startCommand("git", logArgs...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cmd.Stdin.Close()
|
||||
|
||||
pchan := make(chan *WrappedPointer, chanBufSize)
|
||||
errchan := make(chan error, 1)
|
||||
|
||||
// we pull out deletions, since we want the previous SHAs at commits in the range
|
||||
// this means we pick up all previous versions that could have been checked
|
||||
// out in the date range, not just if the commit which *introduced* them is in the range
|
||||
go func() {
|
||||
parseLogOutputToPointers(cmd.Stdout, LogDiffDeletions, nil, nil, pchan)
|
||||
stderr, _ := ioutil.ReadAll(cmd.Stderr)
|
||||
err := cmd.Wait()
|
||||
if err != nil {
|
||||
errchan <- fmt.Errorf("Error in git log: %v %v", err, string(stderr))
|
||||
}
|
||||
close(pchan)
|
||||
close(errchan)
|
||||
}()
|
||||
|
||||
return NewPointerChannelWrapper(pchan, errchan), nil
|
||||
|
||||
}
|
||||
|
||||
// Interface for all types of wrapper around a channel of results and an error channel
|
||||
// Implementors will expose a type-specific channel for results
|
||||
// Call the Wait() function after processing the results channel to catch any errors
|
||||
|
Loading…
Reference in New Issue
Block a user