3 files changed,
33 insertions(+),
0 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-03-02 00:46:10 +0200
Change ID:
uopoopxxnnsztyppvwxwqovvsyrpzwxx
Parent:
d985efd
jump to
| M | CHANGELOG.md |
| M | internal/git/gitx/archive.go |
| M | internal/ssh/ssh.go |
M
CHANGELOG.md
@@ -4,6 +4,7 @@ ## 0.3.0 (unreleased)
### Features: - Paginate log page (150 commits per page). +- Support `git-upload-archive`. ### Bug fixes: - Allow downloading only valid and existing refs.
M
internal/git/gitx/archive.go
@@ -25,6 +25,19 @@
return nil } +func UploadArchive(ctx context.Context, repoDir string, in io.Reader, out io.Writer) error { + if err := gitCmd(ctx, cmdOpts{ + RepoDir: repoDir, + Cmd: []string{"upload-archive"}, + 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 {
M
internal/ssh/ssh.go
@@ -107,6 +107,25 @@ }
sess.Exit(0) + case "git-upload-archive": + isPrivate, err := repo.IsPrivate() + if err != nil { + s.gitError(sess, badRequestErrMsg, nil) + return + } + + if isPrivate && !authorized { + s.gitError(sess, badRequestErrMsg, nil) + return + } + + if err := gitx.UploadArchive(ctx, repoPath, sess, sess); err != nil { + s.gitError(sess, internalServerErrMsg, err) + return + } + + sess.Exit(0) + case "git-receive-pack": if !authorized { s.gitError(sess, unauthorizedErrMsg, nil)