| 799 | } |
| 800 | |
| 801 | func (s *GitTokenStore) commitAndPushLocked(message string, relPaths ...string) error { |
| 802 | repoDir := s.repoDirSnapshot() |
| 803 | if repoDir == "" { |
| 804 | return fmt.Errorf("git token store: repository path not configured") |
| 805 | } |
| 806 | repo, err := git.PlainOpen(repoDir) |
| 807 | if err != nil { |
| 808 | return fmt.Errorf("git token store: open repo: %w", err) |
| 809 | } |
| 810 | worktree, err := repo.Worktree() |
| 811 | if err != nil { |
| 812 | return fmt.Errorf("git token store: worktree: %w", err) |
| 813 | } |
| 814 | added := false |
| 815 | for _, rel := range relPaths { |
| 816 | if strings.TrimSpace(rel) == "" { |
| 817 | continue |
| 818 | } |
| 819 | if _, err = worktree.Add(rel); err != nil { |
| 820 | if errors.Is(err, os.ErrNotExist) { |
| 821 | if _, errRemove := worktree.Remove(rel); errRemove != nil && !errors.Is(errRemove, os.ErrNotExist) { |
| 822 | return fmt.Errorf("git token store: remove %s: %w", rel, errRemove) |
| 823 | } |
| 824 | } else { |
| 825 | return fmt.Errorf("git token store: add %s: %w", rel, err) |
| 826 | } |
| 827 | } |
| 828 | added = true |
| 829 | } |
| 830 | if !added { |
| 831 | return nil |
| 832 | } |
| 833 | status, err := worktree.Status() |
| 834 | if err != nil { |
| 835 | return fmt.Errorf("git token store: status: %w", err) |
| 836 | } |
| 837 | if status.IsClean() { |
| 838 | return nil |
| 839 | } |
| 840 | if strings.TrimSpace(message) == "" { |
| 841 | message = "Update auth store" |
| 842 | } |
| 843 | signature := &object.Signature{ |
| 844 | Name: "CLIProxyAPI", |
| 845 | Email: "cliproxy@local", |
| 846 | When: time.Now(), |
| 847 | } |
| 848 | commitHash, err := worktree.Commit(message, &git.CommitOptions{ |
| 849 | Author: signature, |
| 850 | }) |
| 851 | if err != nil { |
| 852 | if errors.Is(err, git.ErrEmptyCommit) { |
| 853 | return nil |
| 854 | } |
| 855 | return fmt.Errorf("git token store: commit: %w", err) |
| 856 | } |
| 857 | headRef, errHead := repo.Head() |
| 858 | if errHead != nil { |