1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // Copyright 2015 The Gogs Authors. All rights reserved.
- // 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 git
-
- import (
- "context"
- "fmt"
- "io"
- "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"
- }
-
- // 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)
- }
-
- args := []string{
- "archive",
- }
- if usePrefix {
- args = append(args, "--prefix="+filepath.Base(strings.TrimSuffix(repo.Path, ".git"))+"/")
- }
-
- args = append(args,
- "--format="+format.String(),
- commitID,
- )
-
- var stderr strings.Builder
- err := NewCommandContext(ctx, args...).RunInDirPipeline(repo.Path, target, &stderr)
- if err != nil {
- return ConcatenateError(err, stderr.String())
- }
- return nil
- }
|