@@ -7,6 +7,7 @@ package repo
77
88import (
99 "encoding/base64"
10+ "fmt"
1011 "net/http"
1112 "time"
1213
@@ -198,6 +199,16 @@ func CreateFile(ctx *context.APIContext, apiOpts api.CreateFileOptions) {
198199 // responses:
199200 // "201":
200201 // "$ref": "#/responses/FileResponse"
202+ // "403":
203+ // "$ref": "#/responses/error"
204+ // "404":
205+ // "$ref": "#/responses/notFound"
206+ // "422":
207+ // "$ref": "#/responses/error"
208+
209+ if ctx .Repo .Repository .IsEmpty {
210+ ctx .Error (http .StatusUnprocessableEntity , "RepoIsEmpty" , fmt .Errorf ("repo is empty" ))
211+ }
201212
202213 if apiOpts .BranchName == "" {
203214 apiOpts .BranchName = ctx .Repo .Repository .DefaultBranch
@@ -235,7 +246,7 @@ func CreateFile(ctx *context.APIContext, apiOpts api.CreateFileOptions) {
235246 }
236247
237248 if fileResponse , err := createOrUpdateFile (ctx , opts ); err != nil {
238- ctx . Error ( http . StatusInternalServerError , "CreateFile" , err )
249+ handleCreateOrUpdateFileError ( ctx , err )
239250 } else {
240251 ctx .JSON (http .StatusCreated , fileResponse )
241252 }
@@ -274,6 +285,16 @@ func UpdateFile(ctx *context.APIContext, apiOpts api.UpdateFileOptions) {
274285 // responses:
275286 // "200":
276287 // "$ref": "#/responses/FileResponse"
288+ // "403":
289+ // "$ref": "#/responses/error"
290+ // "404":
291+ // "$ref": "#/responses/notFound"
292+ // "422":
293+ // "$ref": "#/responses/error"
294+
295+ if ctx .Repo .Repository .IsEmpty {
296+ ctx .Error (http .StatusUnprocessableEntity , "RepoIsEmpty" , fmt .Errorf ("repo is empty" ))
297+ }
277298
278299 if apiOpts .BranchName == "" {
279300 apiOpts .BranchName = ctx .Repo .Repository .DefaultBranch
@@ -313,12 +334,26 @@ func UpdateFile(ctx *context.APIContext, apiOpts api.UpdateFileOptions) {
313334 }
314335
315336 if fileResponse , err := createOrUpdateFile (ctx , opts ); err != nil {
316- ctx . Error ( http . StatusInternalServerError , "UpdateFile" , err )
337+ handleCreateOrUpdateFileError ( ctx , err )
317338 } else {
318339 ctx .JSON (http .StatusOK , fileResponse )
319340 }
320341}
321342
343+ func handleCreateOrUpdateFileError (ctx * context.APIContext , err error ) {
344+ if models .IsErrUserCannotCommit (err ) || models .IsErrFilePathProtected (err ) {
345+ ctx .Error (http .StatusForbidden , "Access" , err )
346+ return
347+ }
348+ if models .IsErrBranchAlreadyExists (err ) || models .IsErrFilenameInvalid (err ) || models .IsErrSHADoesNotMatch (err ) ||
349+ models .IsErrFilePathInvalid (err ) || models .IsErrRepoFileAlreadyExists (err ) {
350+ ctx .Error (http .StatusUnprocessableEntity , "Invalid" , err )
351+ return
352+ }
353+
354+ ctx .Error (http .StatusInternalServerError , "UpdateFile" , err )
355+ }
356+
322357// Called from both CreateFile or UpdateFile to handle both
323358func createOrUpdateFile (ctx * context.APIContext , opts * repofiles.UpdateRepoFileOptions ) (* api.FileResponse , error ) {
324359 if ! canWriteFiles (ctx .Repo ) {
0 commit comments