summaryrefslogtreecommitdiffstats
path: root/modules/git/repo_archive.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-10-11 10:27:00 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-10-11 10:27:00 +0000
commit65aa53fc52ff15efe54df4147564828d535837f8 (patch)
tree31c51dad04fdcca80e6d3043c8bd49d2f1a51f83 /modules/git/repo_archive.go
parentInitial commit. (diff)
downloadforgejo-debian.tar.xz
forgejo-debian.zip
Adding upstream version 8.0.3.HEADupstream/8.0.3upstreamdebian
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'modules/git/repo_archive.go')
-rw-r--r--modules/git/repo_archive.go80
1 files changed, 80 insertions, 0 deletions
diff --git a/modules/git/repo_archive.go b/modules/git/repo_archive.go
new file mode 100644
index 00000000..1bf1aa41
--- /dev/null
+++ b/modules/git/repo_archive.go
@@ -0,0 +1,80 @@
+// Copyright 2015 The Gogs Authors. All rights reserved.
+// Copyright 2020 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package git
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// ArchiveType archive types
+type ArchiveType int
+
+const (
+ // ZIP zip archive type
+ ZIP ArchiveType = iota + 1
+ // TARGZ tar gz archive type
+ TARGZ
+ // BUNDLE bundle archive type
+ BUNDLE
+)
+
+// String converts an ArchiveType to string
+func (a ArchiveType) String() string {
+ switch a {
+ case ZIP:
+ return "zip"
+ case TARGZ:
+ return "tar.gz"
+ case BUNDLE:
+ return "bundle"
+ }
+ return "unknown"
+}
+
+func ToArchiveType(s string) ArchiveType {
+ switch s {
+ case "zip":
+ return ZIP
+ case "tar.gz":
+ return TARGZ
+ case "bundle":
+ return BUNDLE
+ }
+ return 0
+}
+
+// CreateArchive create archive content to the target path
+func (repo *Repository) CreateArchive(ctx context.Context, format ArchiveType, target io.Writer, usePrefix bool, commitID string) error {
+ if format.String() == "unknown" {
+ return fmt.Errorf("unknown format: %v", format)
+ }
+
+ cmd := NewCommand(ctx, "archive")
+ if usePrefix {
+ cmd.AddOptionFormat("--prefix=%s", filepath.Base(strings.TrimSuffix(repo.Path, ".git"))+"/")
+ }
+ cmd.AddOptionFormat("--format=%s", format.String())
+ cmd.AddDynamicArguments(commitID)
+
+ // Avoid LFS hooks getting installed because of /etc/gitconfig, which can break pull requests.
+ env := append(os.Environ(), "GIT_CONFIG_NOSYSTEM=1")
+
+ var stderr strings.Builder
+ err := cmd.Run(&RunOpts{
+ Dir: repo.Path,
+ Stdout: target,
+ Stderr: &stderr,
+ Env: env,
+ })
+ if err != nil {
+ return ConcatenateError(err, stderr.String())
+ }
+ return nil
+}