From 7e9bd206fd13a34ccdd59dfa8bf5474e5e7f000d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexey=20=E3=80=92erentyev?= <axifnx@gmail.com>
Date: Sun, 26 Sep 2021 00:29:25 +0300
Subject: [PATCH] Fix bundle creation (#17079)

Signed-off-by: Alexey Terentyev <axifnx@gmail.com>

Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: Gwyneth Morgan <87623694+gwymor@users.noreply.github.com>
Co-authored-by: Gwyneth Morgan <gwymor@tilde.club>
---
 modules/git/repo.go           | 24 +++++++++++++++++-------
 services/archiver/archiver.go |  6 ++++--
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/modules/git/repo.go b/modules/git/repo.go
index e7d42dacb1..89af7aa9e1 100644
--- a/modules/git/repo.go
+++ b/modules/git/repo.go
@@ -425,14 +425,24 @@ func (repo *Repository) CreateBundle(ctx context.Context, commit string, out io.
 	}
 	defer os.RemoveAll(tmp)
 
-	tmpFile := filepath.Join(tmp, "bundle")
-	args := []string{
-		"bundle",
-		"create",
-		tmpFile,
-		commit,
+	env := append(os.Environ(), "GIT_OBJECT_DIRECTORY="+filepath.Join(repo.Path, "objects"))
+	_, err = NewCommandContext(ctx, "init", "--bare").RunInDirWithEnv(tmp, env)
+	if err != nil {
+		return err
 	}
-	_, err = NewCommandContext(ctx, args...).RunInDir(repo.Path)
+
+	_, err = NewCommandContext(ctx, "reset", "--soft", commit).RunInDirWithEnv(tmp, env)
+	if err != nil {
+		return err
+	}
+
+	_, err = NewCommandContext(ctx, "branch", "-m", "bundle").RunInDirWithEnv(tmp, env)
+	if err != nil {
+		return err
+	}
+
+	tmpFile := filepath.Join(tmp, "bundle")
+	_, err = NewCommandContext(ctx, "bundle", "create", tmpFile, "bundle", "HEAD").RunInDirWithEnv(tmp, env)
 	if err != nil {
 		return err
 	}
diff --git a/services/archiver/archiver.go b/services/archiver/archiver.go
index 6d4d46e4e0..d602b9ed7f 100644
--- a/services/archiver/archiver.go
+++ b/services/archiver/archiver.go
@@ -136,9 +136,11 @@ func doArchive(r *ArchiveRequest) (*models.RepoArchiver, error) {
 	if err == nil {
 		if archiver.Status == models.RepoArchiverGenerating {
 			archiver.Status = models.RepoArchiverReady
-			return archiver, models.UpdateRepoArchiverStatus(ctx, archiver)
+			if err = models.UpdateRepoArchiverStatus(ctx, archiver); err != nil {
+				return nil, err
+			}
 		}
-		return archiver, nil
+		return archiver, committer.Commit()
 	}
 
 	if !errors.Is(err, os.ErrNotExist) {