Commit only versioned files

This commit is contained in:
2025-09-16 15:35:47 +03:00
parent 8b30e53a69
commit 04298cad4e
2 changed files with 76 additions and 17 deletions

View File

@@ -11,42 +11,101 @@ import (
"github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/plumbing/object"
) )
// getenvDefault возвращает значение из окружения по ключу, или заданное
// по умолчанию
func getenvDefault(k, def string) string {
if v := os.Getenv(k); v != "" {
return v
}
return def
}
// normalizePath возвращает нормализованный путь
func normalizePath(p string) string {
p = strings.TrimSpace(p)
p = strings.TrimPrefix(p, "./")
return p
}
// gitCommit выполняет коммит с внесёнными изменениями // gitCommit выполняет коммит с внесёнными изменениями
func gitCommit(bc *BumpConfig, newVersion string) { func gitCommit(bc *BumpConfig, newVersion string, configPath string) {
// Открываем локальный репозиторий (предполагается, что он существует в папке ".") // Открываем локальный репозиторий (предполагается, что он существует в папке ".")
repo, err := git.PlainOpen(".") repo, err := git.PlainOpen(".")
if err != nil { if err != nil {
log.Fatalf("Repository open error: %v", err) log.Fatalf("Repository open error: %v", err)
} }
// Получаем рабочее дерево // получаем рабочее дерево
worktree, err := repo.Worktree() worktree, err := repo.Worktree()
if err != nil { if err != nil {
log.Fatalf("Work directory open error: %v", err) log.Fatalf("Work directory open error: %v", err)
} }
// Добавляем все изменения в индекс (или конкретные файлы, если нужно) // создаём список файлов, которые должны быть включены в коммит
_, err = worktree.Add(".") targets := make([]string, 0, len(bc.FilePaths)+1)
targets = append(targets, bc.FilePaths...)
targets = append(targets, configPath)
// проверяем на наличие изменений
status, err := worktree.Status()
if err != nil { if err != nil {
log.Fatalf("Changes append error: %v", err) log.Fatalf("Status error: %v", err)
} }
// Формируем сообщение коммита changed := false
commitMsg := strings.ReplaceAll(bc.Message, "{current_version}", bc.CurrentVersion) for _, p := range targets {
commitMsg = strings.ReplaceAll(commitMsg, "{new_version}", newVersion) if p == "" {
commit, err := worktree.Commit(commitMsg, &git.CommitOptions{ continue
Author: &object.Signature{ }
Name: os.Getenv("GIT_USERNAME"), p = normalizePath(p)
Email: os.Getenv("GIT_EMAIL"),
When: time.Now(), // пропускаем отсутствующие файлы тихо
}, if _, err := os.Stat(p); err != nil {
if os.IsNotExist(err) {
log.Printf("Skip missing file: %s", p)
continue
}
log.Fatalf("Stat error for %s: %v", p, err)
}
st := status[p]
if st.Worktree != git.Unmodified {
if _, err := worktree.Add(p); err != nil {
log.Fatalf("Add %s error: %v", p, err)
}
changed = true
continue
}
}
if !changed {
log.Printf("No changes detected in configured files; skipping commit.")
return
}
// формируем сообщение коммита
commitMsg := strings.
NewReplacer(
"{current_version}", bc.CurrentVersion,
"{new_version}", newVersion,
).Replace(bc.Message)
author := &object.Signature{
Name: getenvDefault("GIT_USERNAME", "bumpversion"),
Email: getenvDefault("GIT_EMAIL", "bumpversion@deploy"),
When: time.Now().UTC(),
}
hash, err := worktree.Commit(commitMsg, &git.CommitOptions{
Author: author,
Committer: author,
}) })
if err != nil { if err != nil {
log.Fatalf("Commit error: %v", err) log.Fatalf("Commit error: %v", err)
} }
// Получаем объект коммита (по его хэшу) // Получаем объект коммита (по его хэшу)
commitObj, err := repo.CommitObject(commit) commitObj, err := repo.CommitObject(hash)
if err != nil { if err != nil {
log.Fatalf("Commit object error: %v", err) log.Fatalf("Commit object error: %v", err)
} }

View File

@@ -162,7 +162,7 @@ func resolveFlag(positive, negative *bool, defaultValue bool) bool {
// Версия приложения // Версия приложения
const ( const (
AppName = "BumpVersion" AppName = "BumpVersion"
AppVersion = "0.1.2" AppVersion = "0.1.3"
) )
func main() { func main() {
@@ -220,7 +220,7 @@ func main() {
// Выполняем git commit и tag, если требуется // Выполняем git commit и tag, если требуется
if shouldCommit { if shouldCommit {
gitCommit(bc, newVersion) gitCommit(bc, newVersion, cfg_name)
} }
// Выполняем git commit и tag, если требуется // Выполняем git commit и tag, если требуется