diff options
author | 6543 <6543@obermui.de> | 2020-05-31 22:59:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-31 21:59:34 +0100 |
commit | b636cd6fd40ae05f22e732574da10af060273f9f (patch) | |
tree | 83de939bca57ad39c588117678079d9dc3e64751 /routers | |
parent | 34b6983f566d3ced9d0ff9a4e1c2138b6d7fbcfe (diff) | |
download | gitea-b636cd6fd40ae05f22e732574da10af060273f9f.tar.gz gitea-b636cd6fd40ae05f22e732574da10af060273f9f.zip |
Handle expected errors in FileCreate & FileUpdate API (#11643)
as title
needed for #11641
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/v1/repo/file.go | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index 02a7de9b58..73b8e31a44 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -7,6 +7,7 @@ package repo import ( "encoding/base64" + "fmt" "net/http" "time" @@ -198,6 +199,16 @@ func CreateFile(ctx *context.APIContext, apiOpts api.CreateFileOptions) { // responses: // "201": // "$ref": "#/responses/FileResponse" + // "403": + // "$ref": "#/responses/error" + // "404": + // "$ref": "#/responses/notFound" + // "422": + // "$ref": "#/responses/error" + + if ctx.Repo.Repository.IsEmpty { + ctx.Error(http.StatusUnprocessableEntity, "RepoIsEmpty", fmt.Errorf("repo is empty")) + } if apiOpts.BranchName == "" { apiOpts.BranchName = ctx.Repo.Repository.DefaultBranch @@ -235,7 +246,7 @@ func CreateFile(ctx *context.APIContext, apiOpts api.CreateFileOptions) { } if fileResponse, err := createOrUpdateFile(ctx, opts); err != nil { - ctx.Error(http.StatusInternalServerError, "CreateFile", err) + handleCreateOrUpdateFileError(ctx, err) } else { ctx.JSON(http.StatusCreated, fileResponse) } @@ -274,6 +285,16 @@ func UpdateFile(ctx *context.APIContext, apiOpts api.UpdateFileOptions) { // responses: // "200": // "$ref": "#/responses/FileResponse" + // "403": + // "$ref": "#/responses/error" + // "404": + // "$ref": "#/responses/notFound" + // "422": + // "$ref": "#/responses/error" + + if ctx.Repo.Repository.IsEmpty { + ctx.Error(http.StatusUnprocessableEntity, "RepoIsEmpty", fmt.Errorf("repo is empty")) + } if apiOpts.BranchName == "" { apiOpts.BranchName = ctx.Repo.Repository.DefaultBranch @@ -313,12 +334,26 @@ func UpdateFile(ctx *context.APIContext, apiOpts api.UpdateFileOptions) { } if fileResponse, err := createOrUpdateFile(ctx, opts); err != nil { - ctx.Error(http.StatusInternalServerError, "UpdateFile", err) + handleCreateOrUpdateFileError(ctx, err) } else { ctx.JSON(http.StatusOK, fileResponse) } } +func handleCreateOrUpdateFileError(ctx *context.APIContext, err error) { + if models.IsErrUserCannotCommit(err) || models.IsErrFilePathProtected(err) { + ctx.Error(http.StatusForbidden, "Access", err) + return + } + if models.IsErrBranchAlreadyExists(err) || models.IsErrFilenameInvalid(err) || models.IsErrSHADoesNotMatch(err) || + models.IsErrFilePathInvalid(err) || models.IsErrRepoFileAlreadyExists(err) { + ctx.Error(http.StatusUnprocessableEntity, "Invalid", err) + return + } + + ctx.Error(http.StatusInternalServerError, "UpdateFile", err) +} + // Called from both CreateFile or UpdateFile to handle both func createOrUpdateFile(ctx *context.APIContext, opts *repofiles.UpdateRepoFileOptions) (*api.FileResponse, error) { if !canWriteFiles(ctx.Repo) { |