From 7979c3654eb91adce4fd9717d9ff891496a56ff3 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Fri, 4 Jun 2021 21:14:20 +0800
Subject: [PATCH] Copy git data from disk when restore repository (#16066)

---
 modules/migrations/gitea_uploader.go | 9 ++++++---
 modules/migrations/migrate.go        | 2 +-
 modules/migrations/restore.go        | 6 ++++--
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/modules/migrations/gitea_uploader.go b/modules/migrations/gitea_uploader.go
index 217acb00e21..2b18098b7f1 100644
--- a/modules/migrations/gitea_uploader.go
+++ b/modules/migrations/gitea_uploader.go
@@ -276,19 +276,22 @@ func (g *GiteaLocalUploader) CreateReleases(releases ...*base.Release) error {
 				// asset.DownloadURL maybe a local file
 				var rc io.ReadCloser
 				var err error
-				if asset.DownloadURL == nil {
+				if asset.DownloadFunc != nil {
 					rc, err = asset.DownloadFunc()
 					if err != nil {
 						return err
 					}
-				} else {
+				} else if asset.DownloadURL != nil {
 					rc, err = uri.Open(*asset.DownloadURL)
 					if err != nil {
 						return err
 					}
 				}
-				defer rc.Close()
+				if rc == nil {
+					return nil
+				}
 				_, err = storage.Attachments.Save(attach.RelativePath(), rc, int64(*asset.Size))
+				rc.Close()
 				return err
 			}()
 			if err != nil {
diff --git a/modules/migrations/migrate.go b/modules/migrations/migrate.go
index 2f8889e67b5..7eff3a3576d 100644
--- a/modules/migrations/migrate.go
+++ b/modules/migrations/migrate.go
@@ -184,7 +184,7 @@ func migrateRepository(downloader base.Downloader, uploader base.Uploader, opts
 		return err
 	}
 
-	log.Trace("migrating git data")
+	log.Trace("migrating git data from %s", repo.CloneURL)
 	if err = uploader.CreateRepo(repo, opts); err != nil {
 		return err
 	}
diff --git a/modules/migrations/restore.go b/modules/migrations/restore.go
index 4e63df14292..5b44811d529 100644
--- a/modules/migrations/restore.go
+++ b/modules/migrations/restore.go
@@ -83,7 +83,7 @@ func (r *RepositoryRestorer) GetRepoInfo() (*base.Repository, error) {
 		IsPrivate:     isPrivate,
 		Description:   opts["description"],
 		OriginalURL:   opts["original_url"],
-		CloneURL:      opts["clone_addr"],
+		CloneURL:      filepath.Join(r.baseDir, "git"),
 		DefaultBranch: opts["default_branch"],
 	}, nil
 }
@@ -155,7 +155,9 @@ func (r *RepositoryRestorer) GetReleases() ([]*base.Release, error) {
 	}
 	for _, rel := range releases {
 		for _, asset := range rel.Assets {
-			*asset.DownloadURL = "file://" + filepath.Join(r.baseDir, *asset.DownloadURL)
+			if asset.DownloadURL != nil {
+				*asset.DownloadURL = "file://" + filepath.Join(r.baseDir, *asset.DownloadURL)
+			}
 		}
 	}
 	return releases, nil