diff options
author | Runxi Yu <me@runxiyu.org> | 2025-02-17 07:21:11 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-02-17 07:21:11 +0800 |
commit | b5e5732336fa77c39955ddb15b04e84f18285fdb (patch) | |
tree | a49d1b2cf0a280dfa8d6ed03689c23495ad07f2d | |
parent | ssh_handle_upload_pack: Use system git-upload-pack (diff) | |
download | forge-b5e5732336fa77c39955ddb15b04e84f18285fdb.tar.gz forge-b5e5732336fa77c39955ddb15b04e84f18285fdb.tar.zst forge-b5e5732336fa77c39955ddb15b04e84f18285fdb.zip |
ssh_handle_receive_pack: Use system git-receive-pack
Diffstat (limited to '')
-rw-r--r-- | ssh_handle_receive_pack.go | 51 |
1 files changed, 18 insertions, 33 deletions
diff --git a/ssh_handle_receive_pack.go b/ssh_handle_receive_pack.go index 30825ad..2bf28b8 100644 --- a/ssh_handle_receive_pack.go +++ b/ssh_handle_receive_pack.go @@ -2,12 +2,10 @@ package main import ( "errors" + "fmt" + "os/exec" glider_ssh "github.com/gliderlabs/ssh" - "github.com/go-git/go-billy/v5/osfs" - "github.com/go-git/go-git/v5/plumbing/protocol/packp" - "github.com/go-git/go-git/v5/plumbing/transport" - transport_server "github.com/go-git/go-git/v5/plumbing/transport/server" ) var err_unauthorized_push = errors.New("You are not authorized to push to this repository") @@ -20,37 +18,24 @@ func ssh_handle_receive_pack(session glider_ssh.Session, pubkey string, repo_ide if !access { return err_unauthorized_push } - endpoint, err := transport.NewEndpoint("/") - if err != nil { - return err - } - billy_fs := osfs.New(repo_path) - fs_loader := transport_server.NewFilesystemLoader(billy_fs) - transport := transport_server.NewServer(fs_loader) - receive_pack_session, err := transport.NewReceivePackSession(endpoint, nil) - if err != nil { - return err - } - advertised_references, err := receive_pack_session.AdvertisedReferencesContext(session.Context()) - if err != nil { - return err - } - err = advertised_references.Encode(session) - if err != nil { - return err - } - reference_update_request := packp.NewReferenceUpdateRequest() - err = reference_update_request.Decode(session) - if err != nil { - return err - } - report_status, err := receive_pack_session.ReceivePack(session.Context(), reference_update_request) + + proc := exec.CommandContext(session.Context(), "git-receive-pack", repo_path) + proc.Stdin = session + proc.Stdout = session + proc.Stderr = session.Stderr() + + err = proc.Start() if err != nil { + fmt.Fprintln(session.Stderr(), "Error while starting process:", err) return err } - err = report_status.Encode(session) - if err != nil { - return err + + err = proc.Wait() + if exitError, ok := err.(*exec.ExitError); ok { + fmt.Fprintln(session.Stderr(), "Process exited with error", exitError.ExitCode()) + } else if err != nil { + fmt.Fprintln(session.Stderr(), "Error while waiting for process:", err) } - return nil + + return err } |