mugit/internal/git/archive.go(view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package git
import (
"context"
"fmt"
"io"
"regexp"
"strings"
)
// ArchiveTar generates a tarball of a git ref.
func (g *Repo) ArchiveTar(ctx context.Context, ref string, out io.Writer) error {
if !isValidRef(ref) {
return fmt.Errorf("invalid ref: %s", ref)
}
if err := gitCmd(ctx, cmdOpts{
Cmd: []string{"archive", "--format=tar.gz", ref},
RepoDir: g.path,
Stdout: out,
}); err != nil {
return fmt.Errorf("git archive %s: %w", ref, err)
}
return nil
}
func (g *Repo) UploadArchive(ctx context.Context, in io.Reader, out io.Writer) error {
if err := gitCmd(ctx, cmdOpts{
Cmd: []string{"upload-archive"},
RepoDir: g.path,
Stdin: in,
Stdout: out,
Stderr: out,
}); err != nil {
return fmt.Errorf("git-upload-archive: %w", err)
}
return nil
}
var isValidRefRe = regexp.MustCompile(`^[a-zA-Z0-9._/-]+$`)
func isValidRef(ref string) bool {
if ref == "" || strings.Contains(ref, "..") {
return false
}
return isValidRefRe.MatchString(ref)
}
|