mugit/internal/git/gitx/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 |
package gitx
import (
"context"
"fmt"
"io"
"regexp"
"strings"
)
// ArchiveTar generates a tarball of a git ref.
func ArchiveTar(ctx context.Context, repoDir, 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: repoDir,
Stdout: out,
}); err != nil {
return fmt.Errorf("git archive %s: %w", ref, 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)
}
|