aboutsummaryrefslogtreecommitdiff
path: root/forged/internal/git2c
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-08-12 11:01:07 +0800
committerRunxi Yu <me@runxiyu.org>2025-09-15 15:19:12 +0800
commiteb82fdb2dc0903e6125014abd64aceab42c8eb35 (patch)
treec07276ba1595c415ebc28943163d88f3e3180254 /forged/internal/git2c
parentRemove forge-specific functions from misc (diff)
downloadforge-eb82fdb2dc0903e6125014abd64aceab42c8eb35.tar.gz
forge-eb82fdb2dc0903e6125014abd64aceab42c8eb35.tar.zst
forge-eb82fdb2dc0903e6125014abd64aceab42c8eb35.zip
RefactorHEADmaster
Diffstat (limited to 'forged/internal/git2c')
-rw-r--r--forged/internal/git2c/client.go46
-rw-r--r--forged/internal/git2c/cmd_index.go65
-rw-r--r--forged/internal/git2c/cmd_treeraw.go94
-rw-r--r--forged/internal/git2c/git_types.go28
-rw-r--r--forged/internal/git2c/perror.go48
5 files changed, 0 insertions, 281 deletions
diff --git a/forged/internal/git2c/client.go b/forged/internal/git2c/client.go
deleted file mode 100644
index ed9390c..0000000
--- a/forged/internal/git2c/client.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-only
-// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org>
-
-// Package git2c provides routines to interact with the git2d backend daemon.
-package git2c
-
-import (
- "fmt"
- "net"
-
- "go.lindenii.runxiyu.org/forge/forged/internal/bare"
-)
-
-// Client represents a connection to the git2d backend daemon.
-type Client struct {
- socketPath string
- conn net.Conn
- writer *bare.Writer
- reader *bare.Reader
-}
-
-// NewClient establishes a connection to a git2d socket and returns a new Client.
-func NewClient(socketPath string) (*Client, error) {
- conn, err := net.Dial("unix", socketPath)
- if err != nil {
- return nil, fmt.Errorf("git2d connection failed: %w", err)
- }
-
- writer := bare.NewWriter(conn)
- reader := bare.NewReader(conn)
-
- return &Client{
- socketPath: socketPath,
- conn: conn,
- writer: writer,
- reader: reader,
- }, nil
-}
-
-// Close terminates the underlying socket connection.
-func (c *Client) Close() error {
- if c.conn != nil {
- return c.conn.Close()
- }
- return nil
-}
diff --git a/forged/internal/git2c/cmd_index.go b/forged/internal/git2c/cmd_index.go
deleted file mode 100644
index 8862b2c..0000000
--- a/forged/internal/git2c/cmd_index.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-only
-// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org>
-
-package git2c
-
-import (
- "encoding/hex"
- "errors"
- "fmt"
- "io"
-)
-
-// CmdIndex requests a repository index from git2d and returns the list of commits
-// and the contents of a README file if available.
-func (c *Client) CmdIndex(repoPath string) ([]Commit, *FilenameContents, error) {
- if err := c.writer.WriteData([]byte(repoPath)); err != nil {
- return nil, nil, fmt.Errorf("sending repo path failed: %w", err)
- }
- if err := c.writer.WriteUint(1); err != nil {
- return nil, nil, fmt.Errorf("sending command failed: %w", err)
- }
-
- status, err := c.reader.ReadUint()
- if err != nil {
- return nil, nil, fmt.Errorf("reading status failed: %w", err)
- }
- if status != 0 {
- return nil, nil, fmt.Errorf("git2d error: %d", status)
- }
-
- // README
- readmeRaw, err := c.reader.ReadData()
- if err != nil {
- readmeRaw = nil
- }
-
- readmeFilename := "README.md" // TODO
- readme := &FilenameContents{Filename: readmeFilename, Content: readmeRaw}
-
- // Commits
- var commits []Commit
- for {
- id, err := c.reader.ReadData()
- if err != nil {
- if errors.Is(err, io.EOF) {
- break
- }
- return nil, nil, fmt.Errorf("reading commit ID failed: %w", err)
- }
- title, _ := c.reader.ReadData()
- authorName, _ := c.reader.ReadData()
- authorEmail, _ := c.reader.ReadData()
- authorDate, _ := c.reader.ReadData()
-
- commits = append(commits, Commit{
- Hash: hex.EncodeToString(id),
- Author: string(authorName),
- Email: string(authorEmail),
- Date: string(authorDate),
- Message: string(title),
- })
- }
-
- return commits, readme, nil
-}
diff --git a/forged/internal/git2c/cmd_treeraw.go b/forged/internal/git2c/cmd_treeraw.go
deleted file mode 100644
index 492cb84..0000000
--- a/forged/internal/git2c/cmd_treeraw.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-only
-// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org>
-
-package git2c
-
-import (
- "errors"
- "fmt"
- "io"
-)
-
-// CmdTreeRaw queries git2d for a tree or blob object at the given path within the repository.
-// It returns either a directory listing or the contents of a file.
-func (c *Client) CmdTreeRaw(repoPath, pathSpec string) ([]TreeEntry, string, error) {
- if err := c.writer.WriteData([]byte(repoPath)); err != nil {
- return nil, "", fmt.Errorf("sending repo path failed: %w", err)
- }
- if err := c.writer.WriteUint(2); err != nil {
- return nil, "", fmt.Errorf("sending command failed: %w", err)
- }
- if err := c.writer.WriteData([]byte(pathSpec)); err != nil {
- return nil, "", fmt.Errorf("sending path failed: %w", err)
- }
-
- status, err := c.reader.ReadUint()
- if err != nil {
- return nil, "", fmt.Errorf("reading status failed: %w", err)
- }
-
- switch status {
- case 0:
- kind, err := c.reader.ReadUint()
- if err != nil {
- return nil, "", fmt.Errorf("reading object kind failed: %w", err)
- }
-
- switch kind {
- case 1:
- // Tree
- count, err := c.reader.ReadUint()
- if err != nil {
- return nil, "", fmt.Errorf("reading entry count failed: %w", err)
- }
-
- var files []TreeEntry
- for range count {
- typeCode, err := c.reader.ReadUint()
- if err != nil {
- return nil, "", fmt.Errorf("error reading entry type: %w", err)
- }
- mode, err := c.reader.ReadUint()
- if err != nil {
- return nil, "", fmt.Errorf("error reading entry mode: %w", err)
- }
- size, err := c.reader.ReadUint()
- if err != nil {
- return nil, "", fmt.Errorf("error reading entry size: %w", err)
- }
- name, err := c.reader.ReadData()
- if err != nil {
- return nil, "", fmt.Errorf("error reading entry name: %w", err)
- }
-
- files = append(files, TreeEntry{
- Name: string(name),
- Mode: fmt.Sprintf("%06o", mode),
- Size: size,
- IsFile: typeCode == 2,
- IsSubtree: typeCode == 1,
- })
- }
-
- return files, "", nil
-
- case 2:
- // Blob
- content, err := c.reader.ReadData()
- if err != nil && !errors.Is(err, io.EOF) {
- return nil, "", fmt.Errorf("error reading file content: %w", err)
- }
-
- return nil, string(content), nil
-
- default:
- return nil, "", fmt.Errorf("unknown kind: %d", kind)
- }
-
- case 3:
- return nil, "", fmt.Errorf("path not found: %s", pathSpec)
-
- default:
- return nil, "", fmt.Errorf("unknown status code: %d", status)
- }
-}
diff --git a/forged/internal/git2c/git_types.go b/forged/internal/git2c/git_types.go
deleted file mode 100644
index bf13f05..0000000
--- a/forged/internal/git2c/git_types.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-only
-// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org>
-
-package git2c
-
-// Commit represents a single commit object retrieved from the git2d daemon.
-type Commit struct {
- Hash string
- Author string
- Email string
- Date string
- Message string
-}
-
-// FilenameContents holds the filename and byte contents of a file, such as a README.
-type FilenameContents struct {
- Filename string
- Content []byte
-}
-
-// TreeEntry represents a file or directory entry within a Git tree object.
-type TreeEntry struct {
- Name string
- Mode string
- Size uint64
- IsFile bool
- IsSubtree bool
-}
diff --git a/forged/internal/git2c/perror.go b/forged/internal/git2c/perror.go
deleted file mode 100644
index 96bffd5..0000000
--- a/forged/internal/git2c/perror.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0-only
-// SPDX-FileCopyrightText: Copyright (c) 2025 Runxi Yu <https://runxiyu.org>
-
-// TODO: Make the C part report detailed error messages too
-
-package git2c
-
-import "errors"
-
-var (
- Success error
- ErrUnknown = errors.New("git2c: unknown error")
- ErrPath = errors.New("git2c: get tree entry by path failed")
- ErrRevparse = errors.New("git2c: revparse failed")
- ErrReadme = errors.New("git2c: no readme")
- ErrBlobExpected = errors.New("git2c: blob expected")
- ErrEntryToObject = errors.New("git2c: tree entry to object conversion failed")
- ErrBlobRawContent = errors.New("git2c: get blob raw content failed")
- ErrRevwalk = errors.New("git2c: revwalk failed")
- ErrRevwalkPushHead = errors.New("git2c: revwalk push head failed")
- ErrBareProto = errors.New("git2c: bare protocol error")
-)
-
-func Perror(errno uint) error {
- switch errno {
- case 0:
- return Success
- case 3:
- return ErrPath
- case 4:
- return ErrRevparse
- case 5:
- return ErrReadme
- case 6:
- return ErrBlobExpected
- case 7:
- return ErrEntryToObject
- case 8:
- return ErrBlobRawContent
- case 9:
- return ErrRevwalk
- case 10:
- return ErrRevwalkPushHead
- case 11:
- return ErrBareProto
- }
- return ErrUnknown
-}