aboutsummaryrefslogtreecommitdiff
path: root/git2c/cmd1.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-04-05 17:21:14 +0800
committerRunxi Yu <me@runxiyu.org>2025-04-05 17:21:14 +0800
commit9b17278aece47aca17d32a37f67b7078708e78be (patch)
tree8badae3ed3e9594fae3f9de6e23468165a69e5d4 /git2c/cmd1.go
parentRemove the extra .gitignore in man/ (diff)
downloadforge-9b17278aece47aca17d32a37f67b7078708e78be.tar.gz
forge-9b17278aece47aca17d32a37f67b7078708e78be.tar.zst
forge-9b17278aece47aca17d32a37f67b7078708e78be.zip
Refactor git2d comms to ./git2c
Diffstat (limited to 'git2c/cmd1.go')
-rw-r--r--git2c/cmd1.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/git2c/cmd1.go b/git2c/cmd1.go
new file mode 100644
index 0000000..ba59b5a
--- /dev/null
+++ b/git2c/cmd1.go
@@ -0,0 +1,60 @@
+package git2c
+
+import (
+ "encoding/hex"
+ "errors"
+ "fmt"
+ "io"
+)
+
+func (c *Client) Cmd1(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
+}