Files
blackbox/pkg/commitlater/commitlater.go
Tom Limoncelli 1c77c87555 Implement blackbox in Golang (#250)
* Initial release
2020-07-24 14:21:33 -04:00

85 lines
1.8 KiB
Go

package commitlater
import (
"fmt"
)
type future struct {
message string // Message that describes this transaction.
dir string // Basedir of the files
files []string // Names of the files
display []string // Names as to be displayed to the user
}
// List of futures to be done in the future.
type List struct {
items []*future
}
// Add queues up a future commit.
func (list *List) Add(message string, repobasedir string, files []string) {
item := &future{
message: message,
dir: repobasedir,
files: files,
}
list.items = append(list.items, item)
}
func sameDirs(l *List) bool {
if len(l.items) <= 1 {
return true
}
for _, k := range l.items[1:] {
if k.dir != l.items[0].dir {
return false
}
}
return true
}
// Flush executes queued commits.
func (list *List) Flush(
title string,
fadd func([]string) error,
fcommit func([]string, string, []string) error,
) error {
// Just list the individual commit commands.
if title == "" || len(list.items) < 2 || !sameDirs(list) {
for _, fut := range list.items {
err := fadd(fut.files)
if err != nil {
return fmt.Errorf("add files1 (%q) failed: %w", fut.files, err)
}
err = fcommit([]string{fut.message}, fut.dir, fut.files)
if err != nil {
return fmt.Errorf("commit files (%q) failed: %w", fut.files, err)
}
}
return nil
}
// Create a long commit message.
var m []string
var f []string
for _, fut := range list.items {
err := fadd(fut.files)
if err != nil {
return fmt.Errorf("add files2 (%q) failed: %w", fut.files, err)
}
m = append(m, fut.message)
f = append(f, fut.files...)
}
msg := []string{title}
for _, mm := range m {
msg = append(msg, " * "+mm)
}
err := fcommit(msg, list.items[0].dir, f)
if err != nil {
return fmt.Errorf("commit files (%q) failed: %w", f, err)
}
return nil
}