diff options
| author | 2026-03-30 19:51:58 +0000 | |
|---|---|---|
| committer | 2026-03-30 19:57:33 +0000 | |
| commit | da621b97d0aa209e7e502e9e898e0a7a89857216 (patch) | |
| tree | c1484d878f85216ebf108e1e72136ccdabe4156f /cmd/receivepack9418 | |
| parent | repository: Use dual (diff) | |
| signature | No signature | |
network/receivepack: Use dual
Diffstat (limited to 'cmd/receivepack9418')
| -rw-r--r-- | cmd/receivepack9418/conn.go | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/cmd/receivepack9418/conn.go b/cmd/receivepack9418/conn.go index e3b4d1ac..755cf022 100644 --- a/cmd/receivepack9418/conn.go +++ b/cmd/receivepack9418/conn.go @@ -6,9 +6,13 @@ import ( "fmt" "log" "net" + "os" "strings" "codeberg.org/lindenii/furgit/network/receivepack" + objectdual "codeberg.org/lindenii/furgit/object/store/dual" + objectloose "codeberg.org/lindenii/furgit/object/store/loose" + objectpacked "codeberg.org/lindenii/furgit/object/store/packed" ) func (srv *server) handleConn(conn net.Conn) { @@ -38,12 +42,24 @@ func (srv *server) handleConn(conn net.Conn) { gitProtocol := strings.Join(req.ExtraParameters, ":") + objectIngress, cleanupObjectIngress, err := srv.openObjectIngress() + if err != nil { + writeErrPkt(writer, fmt.Sprintf("object ingress unavailable: %v", err)) + _ = writer.Flush() + + log.Printf("receivepack9418: %s: object ingress unavailable: %v", conn.RemoteAddr(), err) + + return + } + + defer cleanupObjectIngress() + opts := receivepack.Options{ GitProtocol: gitProtocol, Algorithm: srv.repo.Algorithm(), Refs: srv.repo.Refs(), ExistingObjects: srv.repo.Objects(), - ObjectsRoot: srv.objectsRoot, + ObjectIngress: objectIngress, } err = receivepack.ReceivePack(context.Background(), writer, reader, opts) @@ -69,3 +85,38 @@ func (srv *server) handleConn(conn net.Conn) { return } } + +func (srv *server) openObjectIngress() (*objectdual.Dual, func(), error) { + err := srv.objectsRoot.Mkdir("pack", 0o755) + if err != nil && !os.IsExist(err) { + return nil, nil, err + } + + packRoot, err := srv.objectsRoot.OpenRoot("pack") + if err != nil { + return nil, nil, err + } + + looseStore, err := objectloose.New(srv.objectsRoot, srv.repo.Algorithm()) + if err != nil { + _ = packRoot.Close() + + return nil, nil, err + } + + packedStore, err := objectpacked.New(packRoot, srv.repo.Algorithm(), objectpacked.Options{WriteRev: true}) + if err != nil { + _ = looseStore.Close() + _ = packRoot.Close() + + return nil, nil, err + } + + cleanup := func() { + _ = packedStore.Close() + _ = looseStore.Close() + _ = packRoot.Close() + } + + return objectdual.New(looseStore, packedStore), cleanup, nil +} |
