aboutsummaryrefslogtreecommitdiff
path: root/cmd/receivepack9418
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-30 19:51:58 +0000
committerGravatar Runxi Yu2026-03-30 19:57:33 +0000
commitda621b97d0aa209e7e502e9e898e0a7a89857216 (patch)
treec1484d878f85216ebf108e1e72136ccdabe4156f /cmd/receivepack9418
parentrepository: Use dual (diff)
signatureNo signature
network/receivepack: Use dual
Diffstat (limited to 'cmd/receivepack9418')
-rw-r--r--cmd/receivepack9418/conn.go53
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
+}