/
mflw
/
wip
Обзор
Документация
Войти
/
mflw
/
wip
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
internal/git/git.go
181 строка
5 KB
me
добавлено: CLI-команда wip с init/commit/preview/version, интеграция с AI-клиентом и git; добавлен .gitignore и конфигурация проекта
06 мар 2026, 11:30
06 мар 2026, 11:30
2cc834e
Код
Авторство
О чём код?
package git import ( "bytes" "fmt" "os/exec" "strings" ) // DiffInfo содержит информацию об изменениях type DiffInfo struct { Files []string Diff string HasChanges bool } // IsGitRepository проверяет, является ли текущая директория git-репозиторием func IsGitRepository() (bool, error) { cmd := exec.Command("git", "rev-parse", "--is-inside-work-tree") err := cmd.Run() if err != nil { return false, nil } return true, nil } // GetChangedFiles возвращает список измененных файлов func GetChangedFiles() ([]string, error) { // Сначала проверяем staged файлы cmd := exec.Command("git", "diff", "--cached", "--name-only") output, err := cmd.Output() if err != nil { return nil, fmt.Errorf("ошибка получения staged файлов: %w", err) } stagedFiles := parseFileList(string(output)) // Затем unstaged файлы cmd = exec.Command("git", "diff", "--name-only") output, err = cmd.Output() if err != nil { return nil, fmt.Errorf("ошибка получения unstaged файлов: %w", err) } unstagedFiles := parseFileList(string(output)) // Объединяем списки allFiles := append(stagedFiles, unstagedFiles...) return uniqueStrings(allFiles), nil } // GetDiff получает diff всех изменений (staged и unstaged) func GetDiff() (string, error) { var buf bytes.Buffer // Staged изменения cmd := exec.Command("git", "diff", "--cached") cmd.Stdout = &buf if err := cmd.Run(); err != nil { return "", fmt.Errorf("ошибка получения staged diff: %w", err) } // Unstaged изменения cmd = exec.Command("git", "diff") cmd.Stdout = &buf if err := cmd.Run(); err != nil { return "", fmt.Errorf("ошибка получения unstaged diff: %w", err) } return buf.String(), nil } // GetDiffInfo получает полную информацию об изменениях func GetDiffInfo() (*DiffInfo, error) { files, err := GetChangedFiles() if err != nil { return nil, err } diff, err := GetDiff() if err != nil { return nil, err } return &DiffInfo{ Files: files, Diff: diff, HasChanges: len(files) > 0, }, nil } // GetStagedDiffInfo получает информацию только о staged изменениях func GetStagedDiffInfo() (*DiffInfo, error) { cmd := exec.Command("git", "diff", "--cached", "--name-only") output, err := cmd.Output() if err != nil { return nil, fmt.Errorf("ошибка получения staged файлов: %w", err) } files := parseFileList(string(output)) var diff string if len(files) > 0 { cmd = exec.Command("git", "diff", "--cached") diffBytes, err := cmd.Output() if err != nil { return nil, fmt.Errorf("ошибка получения staged diff: %w", err) } diff = string(diffBytes) } return &DiffInfo{ Files: files, Diff: diff, HasChanges: len(files) > 0, }, nil } // HasStagedChanges проверяет, есть ли staged изменения func HasStagedChanges() (bool, error) { cmd := exec.Command("git", "diff", "--cached", "--quiet") err := cmd.Run() if err == nil { return false, nil // нет staged изменений } if exitError, ok := err.(*exec.ExitError); ok { if exitError.ExitCode() == 1 { return true, nil // есть staged изменения } } return false, err } // AddAll добавляет все изменения в staging area func AddAll() error { cmd := exec.Command("git", "add", ".") if err := cmd.Run(); err != nil { return fmt.Errorf("ошибка git add: %w", err) } return nil } // Commit создает коммит с указанным сообщением func Commit(message string) error { cmd := exec.Command("git", "commit", "-m", message) if output, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("ошибка git commit: %w\n%s", err, string(output)) } return nil } // Push выполняет push в удаленный репозиторий func Push() error { cmd := exec.Command("git", "push") if output, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("ошибка git push: %w\n%s", err, string(output)) } return nil } // parseFileList парсит список файлов из вывода git func parseFileList(output string) []string { output = strings.TrimSpace(output) if output == "" { return []string{} } return strings.Split(output, "\n") } // uniqueStrings возвращает срез с уникальными строками func uniqueStrings(slice []string) []string { seen := make(map[string]bool) result := []string{} for _, v := range slice { if !seen[v] { seen[v] = true result = append(result, v) } } return result }