84
pkg/commitlater/commitlater.go
Normal file
84
pkg/commitlater/commitlater.go
Normal file
@@ -0,0 +1,84 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user