@@ -59,6 +59,34 @@ func RangeDiff(r string) (string, error) {
5959 return runGit ("diff" , r )
6060}
6161
62+ func CompareDiff (left , right string , paths []string ) (string , error ) {
63+ left = strings .TrimSpace (left )
64+ right = strings .TrimSpace (right )
65+ if left == "" && right == "" {
66+ return "" , errors .New ("comparison target is empty" )
67+ }
68+
69+ args := []string {"diff" }
70+ switch {
71+ case left != "" && right != "" :
72+ args = append (args , left , right )
73+ case left != "" :
74+ if strings .Contains (left , ".." ) {
75+ args = append (args , left )
76+ } else {
77+ args = append (args , left , "HEAD" )
78+ }
79+ default :
80+ args = append (args , "HEAD" , right )
81+ }
82+
83+ if len (paths ) > 0 {
84+ args = append (args , "--" )
85+ args = append (args , paths ... )
86+ }
87+ return runGit (args ... )
88+ }
89+
6290func BaseDiff (base string ) (string , error ) {
6391 if strings .TrimSpace (base ) == "" {
6492 base = "main"
@@ -134,6 +162,36 @@ func CurrentBranch() (string, error) {
134162 return strings .TrimSpace (out ), nil
135163}
136164
165+ func ListRemotes () ([]string , error ) {
166+ out , err := runGit ("remote" )
167+ if err != nil {
168+ return nil , err
169+ }
170+ return splitNonEmptyLines (out ), nil
171+ }
172+
173+ func RevisionExists (rev string ) (bool , error ) {
174+ rev = strings .TrimSpace (rev )
175+ if rev == "" {
176+ return false , nil
177+ }
178+
179+ cmd := exec .Command ("git" , "rev-parse" , "--verify" , "--quiet" , rev )
180+ var stderr bytes.Buffer
181+ cmd .Stderr = & stderr
182+ if err := cmd .Run (); err != nil {
183+ if exitErr , ok := err .(* exec.ExitError ); ok && exitErr .ExitCode () == 1 {
184+ return false , nil
185+ }
186+ msg := strings .TrimSpace (stderr .String ())
187+ if msg == "" {
188+ msg = err .Error ()
189+ }
190+ return false , fmt .Errorf ("git rev-parse --verify %s failed: %s" , rev , msg )
191+ }
192+ return true , nil
193+ }
194+
137195func ResolveRevision (rev string ) (string , error ) {
138196 if strings .TrimSpace (rev ) == "" {
139197 rev = "HEAD"
0 commit comments