]> source.dussan.org Git - gitea.git/commitdiff
Fix PATCH /repos/{owner}/{repo} panic (#14637)
authorAnton Khimich <anton.khimich@gmail.com>
Thu, 11 Feb 2021 19:53:41 +0000 (14:53 -0500)
committerGitHub <noreply@github.com>
Thu, 11 Feb 2021 19:53:41 +0000 (20:53 +0100)
* Fix a runtime error when modifying a repository through API call

Using the `PATCH /repos/{owner}/{repo}` endpoint and attempting to
modify `default_branch` on an empty repository will cause a
panic. This commit adds a check for a nil pointer before attempting
to dereference it.

* Apply suggestions from code review

* Apply suggestions from code review

* Ensure that the git repository is loaded

If you change the default branch for a repository you must change it in
git too. Therefore you must open the repository before changing the
default branch.

Signed-off-by: Andrew Thornton <art27@cantab.net>
* Allow empty repos to have their default branches changed

Signed-off-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: Anton Khimich <anton.khimicha@mail.utoronto.ca>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: Andrew Thornton <art27@cantab.net>
routers/api/v1/repo/repo.go

index 375f2418b90d12468a3d7c6443e29866cb7216b8..b84c5993e47922702a04cd3e97c97f850e67759e 100644 (file)
@@ -574,8 +574,20 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err
                repo.IsTemplate = *opts.Template
        }
 
-       // Default branch only updated if changed and exist
-       if opts.DefaultBranch != nil && repo.DefaultBranch != *opts.DefaultBranch && ctx.Repo.GitRepo.IsBranchExist(*opts.DefaultBranch) {
+       if ctx.Repo.GitRepo == nil {
+               var err error
+               ctx.Repo.GitRepo, err = git.OpenRepository(ctx.Repo.Repository.RepoPath())
+               if err != nil {
+                       ctx.Error(http.StatusInternalServerError, "Unable to OpenRepository", err)
+                       return err
+               }
+               defer ctx.Repo.GitRepo.Close()
+       }
+
+       // Default branch only updated if changed and exist or the repository is empty
+       if opts.DefaultBranch != nil &&
+               repo.DefaultBranch != *opts.DefaultBranch &&
+               (ctx.Repo.Repository.IsEmpty || ctx.Repo.GitRepo.IsBranchExist(*opts.DefaultBranch)) {
                if err := ctx.Repo.GitRepo.SetDefaultBranch(*opts.DefaultBranch); err != nil {
                        if !git.IsErrUnsupportedVersion(err) {
                                ctx.Error(http.StatusInternalServerError, "SetDefaultBranch", err)