From ba75319157f23031cfca55b5a286f86d36065f35 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Wed, 12 Dec 2018 02:37:32 +0800
Subject: [PATCH] fix clone wiki failed via ssh (#5503)

---
 cmd/serv.go                 | 12 ++++++++----
 modules/private/wiki.go     | 33 +++++++++++++++++++++++++++++++++
 routers/private/internal.go |  1 +
 routers/private/wiki.go     | 34 ++++++++++++++++++++++++++++++++++
 4 files changed, 76 insertions(+), 4 deletions(-)
 create mode 100644 modules/private/wiki.go
 create mode 100644 routers/private/wiki.go

diff --git a/cmd/serv.go b/cmd/serv.go
index 51b0b4984b..c98228745d 100644
--- a/cmd/serv.go
+++ b/cmd/serv.go
@@ -144,11 +144,15 @@ func runServ(c *cli.Context) error {
 		}()
 	}
 
-	isWiki := false
-	unitType := models.UnitTypeCode
+	var (
+		isWiki   bool
+		unitType = models.UnitTypeCode
+		unitName = "code"
+	)
 	if strings.HasSuffix(reponame, ".wiki") {
 		isWiki = true
 		unitType = models.UnitTypeWiki
+		unitName = "wiki"
 		reponame = reponame[:len(reponame)-5]
 	}
 
@@ -245,7 +249,7 @@ func runServ(c *cli.Context) error {
 					clientMessage = "You do not have sufficient authorization for this action"
 				}
 				fail(clientMessage,
-					"User %s does not have level %v access to repository %s",
+					"User %s does not have level %v access to repository %s's "+unitName,
 					user.Name, requestedMode, repoPath)
 			}
 
@@ -304,7 +308,7 @@ func runServ(c *cli.Context) error {
 		gitcmd = exec.Command(verb, repoPath)
 	}
 	if isWiki {
-		if err = repo.InitWiki(); err != nil {
+		if err = private.InitWiki(repo.ID); err != nil {
 			fail("Internal error", "Failed to init wiki repo: %v", err)
 		}
 	}
diff --git a/modules/private/wiki.go b/modules/private/wiki.go
new file mode 100644
index 0000000000..4ad0cc7c4e
--- /dev/null
+++ b/modules/private/wiki.go
@@ -0,0 +1,33 @@
+// Copyright 2018 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package private
+
+import (
+	"fmt"
+
+	"code.gitea.io/gitea/modules/log"
+	"code.gitea.io/gitea/modules/setting"
+)
+
+// InitWiki initwiki via repo id
+func InitWiki(repoID int64) error {
+	// Ask for running deliver hook and test pull request tasks.
+	reqURL := setting.LocalURL + fmt.Sprintf("api/internal/repositories/%d/wiki/init", repoID)
+	log.GitLogger.Trace("InitWiki: %s", reqURL)
+
+	resp, err := newInternalRequest(reqURL, "GET").Response()
+	if err != nil {
+		return err
+	}
+
+	defer resp.Body.Close()
+
+	// All 2XX status codes are accepted and others will return an error
+	if resp.StatusCode/100 != 2 {
+		return fmt.Errorf("Failed to init wiki: %s", decodeJSONError(resp).Err)
+	}
+
+	return nil
+}
diff --git a/routers/private/internal.go b/routers/private/internal.go
index 0221b1fee8..ec2281c5c5 100644
--- a/routers/private/internal.go
+++ b/routers/private/internal.go
@@ -82,6 +82,7 @@ func RegisterRoutes(m *macaron.Macaron) {
 		m.Post("/repositories/:repoid/keys/:keyid/update", UpdateDeployKey)
 		m.Get("/repositories/:repoid/user/:userid/checkunituser", CheckUnitUser)
 		m.Get("/repositories/:repoid/has-keys/:keyid", HasDeployKey)
+		m.Get("/repositories/:repoid/wiki/init", InitWiki)
 		m.Post("/push/update", PushUpdate)
 		m.Get("/protectedbranch/:pbid/:userid", CanUserPush)
 		m.Get("/repo/:owner/:repo", GetRepositoryByOwnerAndName)
diff --git a/routers/private/wiki.go b/routers/private/wiki.go
new file mode 100644
index 0000000000..33bcbaf17e
--- /dev/null
+++ b/routers/private/wiki.go
@@ -0,0 +1,34 @@
+// Copyright 2017 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package private
+
+import (
+	"code.gitea.io/gitea/models"
+
+	macaron "gopkg.in/macaron.v1"
+)
+
+// InitWiki initilizes wiki via repo id
+func InitWiki(ctx *macaron.Context) {
+	repoID := ctx.ParamsInt64("repoid")
+
+	repo, err := models.GetRepositoryByID(repoID)
+	if err != nil {
+		ctx.JSON(500, map[string]interface{}{
+			"err": err.Error(),
+		})
+		return
+	}
+
+	err = repo.InitWiki()
+	if err != nil {
+		ctx.JSON(500, map[string]interface{}{
+			"err": err.Error(),
+		})
+		return
+	}
+
+	ctx.Status(202)
+}