commands/status: partition results of scanIndex()

This commit is contained in:
Taylor Blau 2017-03-20 13:43:21 -06:00
parent babed9a0e3
commit 0fb059d709

@ -30,35 +30,11 @@ func statusCommand(cmd *cobra.Command, args []string) {
statusScanRefRange(ref) statusScanRefRange(ref)
entries, errs, err := scanIndex(scanIndexAt) staged, unstaged, err := scanIndex(scanIndexAt)
if err != nil { if err != nil {
ExitWithError(err) ExitWithError(err)
} }
staged := make([]*lfs.DiffIndexEntry, 0)
unstaged := make([]*lfs.DiffIndexEntry, 0)
L:
for {
select {
case entry, ok := <-entries:
if !ok {
break L
}
switch entry.Status {
case lfs.StatusModification:
unstaged = append(unstaged, entry)
default:
staged = append(staged, entry)
}
case err := <-errs:
if err != nil {
ExitWithError(err)
}
}
}
Print("\nGit LFS objects to be committed:\n") Print("\nGit LFS objects to be committed:\n")
for _, entry := range staged { for _, entry := range staged {
switch entry.Status { switch entry.Status {
@ -77,7 +53,7 @@ L:
Print("") Print("")
} }
func scanIndex(ref string) (<-chan *lfs.DiffIndexEntry, <-chan error, error) { func scanIndex(ref string) (staged, unstaged []*lfs.DiffIndexEntry, err error) {
uncached, err := lfs.NewDiffIndexScanner(ref, false) uncached, err := lfs.NewDiffIndexScanner(ref, false)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -88,39 +64,36 @@ func scanIndex(ref string) (<-chan *lfs.DiffIndexEntry, <-chan error, error) {
return nil, nil, err return nil, nil, err
} }
entries := make(chan *lfs.DiffIndexEntry) seenNames := make(map[string]struct{}, 0)
errs := make(chan error)
go func() { for _, scanner := range []*lfs.DiffIndexScanner{
seenNames := make(map[string]struct{}, 0) uncached, cached,
} {
for scanner.Scan() {
entry := scanner.Entry()
for _, scanner := range []*lfs.DiffIndexScanner{ name := entry.DstName
uncached, cached, if len(name) == 0 {
} { name = entry.SrcName
for scanner.Scan() {
entry := scanner.Entry()
name := entry.DstName
if len(name) == 0 {
name = entry.SrcName
}
if _, seen := seenNames[name]; !seen {
entries <- entry
seenNames[name] = struct{}{}
}
} }
if err := scanner.Err(); err != nil { if _, seen := seenNames[name]; !seen {
errs <- err switch entry.Status {
case lfs.StatusModification:
unstaged = append(unstaged, entry)
default:
staged = append(staged, entry)
}
seenNames[name] = struct{}{}
} }
} }
close(entries) if err := scanner.Err(); err != nil {
close(errs) return nil, nil, err
}() }
}
return entries, errs, nil return
} }
func statusScanRefRange(ref *git.Ref) { func statusScanRefRange(ref *git.Ref) {
@ -153,23 +126,13 @@ func statusScanRefRange(ref *git.Ref) {
} }
func porcelainStagedPointers(ref string) { func porcelainStagedPointers(ref string) {
entries, errs, err := scanIndex(ref) staged, unstaged, err := scanIndex(ref)
if err != nil { if err != nil {
ExitWithError(err) ExitWithError(err)
} }
L: for _, entry := range append(unstaged, staged...) {
for { Print(porcelainStatusLine(entry))
select {
case entry, ok := <-entries:
if !ok {
break L
}
Print(porcelainStatusLine(entry))
case err := <-errs:
ExitWithError(err)
}
} }
} }