summaryrefslogtreecommitdiffstats
path: root/modules/private
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2021-05-10 15:57:45 +0800
committerGitHub <noreply@github.com>2021-05-10 15:57:45 +0800
commite5723d6556d632df08132472066f1bb167753299 (patch)
treeb7254fa85f8348af7375755bd454f59583b1bd25 /modules/private
parent1e6fa57acbe3c05cb996b789e8c2d381c953826f (diff)
downloadgitea-e5723d6556d632df08132472066f1bb167753299.tar.gz
gitea-e5723d6556d632df08132472066f1bb167753299.zip
Move restore repo to internal router and invoke from command to avoid open the same db file or queues files (#15790)
* Move restore repo to internal router and invoke from command to avoid open the same db file or queues files * Follow @zeripath's review * set no timeout for resotre repo private request * make restore repo cancelable
Diffstat (limited to 'modules/private')
-rw-r--r--modules/private/restore_repo.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/modules/private/restore_repo.go b/modules/private/restore_repo.go
new file mode 100644
index 0000000000..6fe2e6844b
--- /dev/null
+++ b/modules/private/restore_repo.go
@@ -0,0 +1,60 @@
+// Copyright 2020 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"
+ "io/ioutil"
+ "net/http"
+ "time"
+
+ "code.gitea.io/gitea/modules/setting"
+ jsoniter "github.com/json-iterator/go"
+)
+
+// RestoreParams structure holds a data for restore repository
+type RestoreParams struct {
+ RepoDir string
+ OwnerName string
+ RepoName string
+ Units []string
+}
+
+// RestoreRepo calls the internal RestoreRepo function
+func RestoreRepo(repoDir, ownerName, repoName string, units []string) (int, string) {
+ reqURL := setting.LocalURL + "api/internal/restore_repo"
+
+ req := newInternalRequest(reqURL, "POST")
+ req.SetTimeout(3*time.Second, 0) // since the request will spend much time, don't timeout
+ req = req.Header("Content-Type", "application/json")
+ json := jsoniter.ConfigCompatibleWithStandardLibrary
+ jsonBytes, _ := json.Marshal(RestoreParams{
+ RepoDir: repoDir,
+ OwnerName: ownerName,
+ RepoName: repoName,
+ Units: units,
+ })
+ req.Body(jsonBytes)
+ resp, err := req.Response()
+ if err != nil {
+ return http.StatusInternalServerError, fmt.Sprintf("Unable to contact gitea: %v, could you confirm it's running?", err.Error())
+ }
+ defer resp.Body.Close()
+
+ if resp.StatusCode != 200 {
+ var ret = struct {
+ Err string `json:"err"`
+ }{}
+ body, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return http.StatusInternalServerError, fmt.Sprintf("Response body error: %v", err.Error())
+ }
+ if err := json.Unmarshal(body, &ret); err != nil {
+ return http.StatusInternalServerError, fmt.Sprintf("Response body Unmarshal error: %v", err.Error())
+ }
+ }
+
+ return http.StatusOK, fmt.Sprintf("Restore repo %s/%s successfully", ownerName, repoName)
+}