diff options
Diffstat (limited to 'forged/internal/git2c')
-rw-r--r-- | forged/internal/git2c/client.go | 46 | ||||
-rw-r--r-- | forged/internal/git2c/cmd_index.go | 65 | ||||
-rw-r--r-- | forged/internal/git2c/cmd_treeraw.go | 94 | ||||
-rw-r--r-- | forged/internal/git2c/git_types.go | 28 | ||||
-rw-r--r-- | forged/internal/git2c/perror.go | 48 |
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 -} |