85 lines
1.8 KiB
Go
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
|
|
}
|