all repos

mugit @ b19bb181082498fdcb3d06dcb0c3453582d6bd8e

🐮 git server that your cow will love
3 files changed, 33 insertions(+), 0 deletions(-)
git: support git archive --remote
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2026-03-02 00:46:10 +0200
Change ID: uopoopxxnnsztyppvwxwqovvsyrpzwxx
Parent: d985efd
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)