2016-11-03 23:16:01 +01:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2016-11-03 23:16:01 +01:00
package git
import (
2024-11-02 19:20:22 +08:00
"context"
"errors"
2016-11-03 23:16:01 +01:00
"fmt"
2020-03-28 04:13:18 +00:00
"strings"
2022-10-18 06:50:37 +01:00
"code.gitea.io/gitea/modules/util"
2016-11-03 23:16:01 +01:00
)
2016-12-22 17:30:52 +08:00
// ErrNotExist commit not exist error
2016-11-03 23:16:01 +01:00
type ErrNotExist struct {
ID string
RelPath string
}
2016-12-22 17:30:52 +08:00
// IsErrNotExist if some error is ErrNotExist
2016-11-03 23:16:01 +01:00
func IsErrNotExist ( err error ) bool {
_ , ok := err . ( ErrNotExist )
return ok
}
func ( err ErrNotExist ) Error ( ) string {
return fmt . Sprintf ( "object does not exist [id: %s, rel_path: %s]" , err . ID , err . RelPath )
}
2022-10-18 06:50:37 +01:00
func ( err ErrNotExist ) Unwrap ( ) error {
return util . ErrNotExist
}
2018-05-01 17:04:36 +10:00
// ErrBadLink entry.FollowLink error
type ErrBadLink struct {
Name string
Message string
}
func ( err ErrBadLink ) Error ( ) string {
return fmt . Sprintf ( "%s: %s" , err . Name , err . Message )
}
2020-02-21 23:04:20 +00:00
// IsErrBadLink if some error is ErrBadLink
func IsErrBadLink ( err error ) bool {
_ , ok := err . ( ErrBadLink )
return ok
}
2019-04-19 14:17:27 +02:00
// ErrBranchNotExist represents a "BranchNotExist" kind of error.
type ErrBranchNotExist struct {
Name string
}
// IsErrBranchNotExist checks if an error is a ErrBranchNotExist.
func IsErrBranchNotExist ( err error ) bool {
_ , ok := err . ( ErrBranchNotExist )
return ok
}
func ( err ErrBranchNotExist ) Error ( ) string {
return fmt . Sprintf ( "branch does not exist [name: %s]" , err . Name )
}
2020-03-28 04:13:18 +00:00
2022-10-18 06:50:37 +01:00
func ( err ErrBranchNotExist ) Unwrap ( ) error {
return util . ErrNotExist
}
2024-02-12 14:37:23 -08:00
// ErrPushOutOfDate represents an error if merging fails due to the base branch being updated
2020-03-28 04:13:18 +00:00
type ErrPushOutOfDate struct {
StdOut string
StdErr string
Err error
}
// IsErrPushOutOfDate checks if an error is a ErrPushOutOfDate.
func IsErrPushOutOfDate ( err error ) bool {
_ , ok := err . ( * ErrPushOutOfDate )
return ok
}
func ( err * ErrPushOutOfDate ) Error ( ) string {
return fmt . Sprintf ( "PushOutOfDate Error: %v: %s\n%s" , err . Err , err . StdErr , err . StdOut )
}
// Unwrap unwraps the underlying error
func ( err * ErrPushOutOfDate ) Unwrap ( ) error {
2022-10-24 21:29:17 +02:00
return fmt . Errorf ( "%w - %s" , err . Err , err . StdErr )
2020-03-28 04:13:18 +00:00
}
// ErrPushRejected represents an error if merging fails due to rejection from a hook
type ErrPushRejected struct {
Message string
StdOut string
StdErr string
Err error
}
// IsErrPushRejected checks if an error is a ErrPushRejected.
func IsErrPushRejected ( err error ) bool {
_ , ok := err . ( * ErrPushRejected )
return ok
}
func ( err * ErrPushRejected ) Error ( ) string {
return fmt . Sprintf ( "PushRejected Error: %v: %s\n%s" , err . Err , err . StdErr , err . StdOut )
}
// Unwrap unwraps the underlying error
func ( err * ErrPushRejected ) Unwrap ( ) error {
2022-10-24 21:29:17 +02:00
return fmt . Errorf ( "%w - %s" , err . Err , err . StdErr )
2020-03-28 04:13:18 +00:00
}
// GenerateMessage generates the remote message from the stderr
func ( err * ErrPushRejected ) GenerateMessage ( ) {
messageBuilder := & strings . Builder { }
i := strings . Index ( err . StdErr , "remote: " )
if i < 0 {
err . Message = ""
return
}
for {
if len ( err . StdErr ) <= i + 8 {
break
}
if err . StdErr [ i : i + 8 ] != "remote: " {
break
}
i += 8
nl := strings . IndexByte ( err . StdErr [ i : ] , '\n' )
if nl >= 0 {
messageBuilder . WriteString ( err . StdErr [ i : i + nl + 1 ] )
i = i + nl + 1
} else {
messageBuilder . WriteString ( err . StdErr [ i : ] )
i = len ( err . StdErr )
}
}
err . Message = strings . TrimSpace ( messageBuilder . String ( ) )
}
2021-06-24 00:08:26 +03:00
// ErrMoreThanOne represents an error if pull request fails when there are more than one sources (branch, tag) with the same name
type ErrMoreThanOne struct {
StdOut string
StdErr string
Err error
}
// IsErrMoreThanOne checks if an error is a ErrMoreThanOne
func IsErrMoreThanOne ( err error ) bool {
_ , ok := err . ( * ErrMoreThanOne )
return ok
}
func ( err * ErrMoreThanOne ) Error ( ) string {
return fmt . Sprintf ( "ErrMoreThanOne Error: %v: %s\n%s" , err . Err , err . StdErr , err . StdOut )
}
2024-11-02 19:20:22 +08:00
func IsErrCanceledOrKilled ( err error ) bool {
// When "cancel()" a git command's context, the returned error of "Run()" could be one of them:
// - context.Canceled
// - *exec.ExitError: "signal: killed"
return err != nil && ( errors . Is ( err , context . Canceled ) || err . Error ( ) == "signal: killed" )
}