diff options
author | Runxi Yu <me@runxiyu.org> | 2025-02-16 00:32:46 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-02-16 00:33:04 +0800 |
commit | 2cd785fc9e7d25e7504fa552cd94607d250665b0 (patch) | |
tree | 8c72000e687ad1841358353aae87693e05e266cf /ssh_handle_receive_pack.go | |
parent | README.md: Add Libera channel (diff) | |
download | forge-2cd785fc9e7d25e7504fa552cd94607d250665b0.tar.gz forge-2cd785fc9e7d25e7504fa552cd94607d250665b0.tar.zst forge-2cd785fc9e7d25e7504fa552cd94607d250665b0.zip |
ssh_*: Use pure go-git SSH handling (receive and upload)
Diffstat (limited to 'ssh_handle_receive_pack.go')
-rw-r--r-- | ssh_handle_receive_pack.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/ssh_handle_receive_pack.go b/ssh_handle_receive_pack.go new file mode 100644 index 0000000..69af8f5 --- /dev/null +++ b/ssh_handle_receive_pack.go @@ -0,0 +1,49 @@ +package main + +import ( + 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" +) + +func ssh_handle_receive_pack(session glider_ssh.Session, repo_identifier string) (err error) { + repo_path, err := get_repo_path_from_ssh_path(session.Context(), repo_identifier) + if err != nil { + return err + } + 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) + if err != nil { + return err + } + err = report_status.Encode(session) + if err != nil { + return err + } + return nil +} |