A vibe coded tangled fork which supports pijul.
1package pijul
2
3import (
4 "bytes"
5 "fmt"
6 "os/exec"
7)
8
9const (
10 fieldSeparator = "\x1f" // ASCII Unit Separator
11 recordSeparator = "\x1e" // ASCII Record Separator
12)
13
14// runPijulCmd executes a pijul command in the repository directory
15func (p *PijulRepo) runPijulCmd(command string, extraArgs ...string) ([]byte, error) {
16 var args []string
17 args = append(args, command)
18 args = append(args, extraArgs...)
19
20 cmd := exec.Command("pijul", args...)
21 cmd.Dir = p.path
22
23 var stdout, stderr bytes.Buffer
24 cmd.Stdout = &stdout
25 cmd.Stderr = &stderr
26
27 err := cmd.Run()
28 if err != nil {
29 if exitErr, ok := err.(*exec.ExitError); ok {
30 return nil, fmt.Errorf("%w, stderr: %s", exitErr, stderr.String())
31 }
32 return nil, fmt.Errorf("pijul %s: %w", command, err)
33 }
34
35 return stdout.Bytes(), nil
36}
37
38// runPijulCmdWithStdin executes a pijul command with stdin input
39func (p *PijulRepo) runPijulCmdWithStdin(stdin []byte, command string, extraArgs ...string) ([]byte, error) {
40 var args []string
41 args = append(args, command)
42 args = append(args, extraArgs...)
43
44 cmd := exec.Command("pijul", args...)
45 cmd.Dir = p.path
46 cmd.Stdin = bytes.NewReader(stdin)
47
48 var stdout, stderr bytes.Buffer
49 cmd.Stdout = &stdout
50 cmd.Stderr = &stderr
51
52 err := cmd.Run()
53 if err != nil {
54 if exitErr, ok := err.(*exec.ExitError); ok {
55 return nil, fmt.Errorf("%w, stderr: %s", exitErr, stderr.String())
56 }
57 return nil, fmt.Errorf("pijul %s: %w", command, err)
58 }
59
60 return stdout.Bytes(), nil
61}
62
63// log runs pijul log with arguments
64func (p *PijulRepo) log(extraArgs ...string) ([]byte, error) {
65 return p.runPijulCmd("log", extraArgs...)
66}
67
68// channelCmd runs pijul channel with arguments
69func (p *PijulRepo) channelCmd(extraArgs ...string) ([]byte, error) {
70 return p.runPijulCmd("channel", extraArgs...)
71}
72
73// diff runs pijul diff with arguments
74func (p *PijulRepo) diff(extraArgs ...string) ([]byte, error) {
75 return p.runPijulCmd("diff", extraArgs...)
76}
77
78// change runs pijul change (show change details) with arguments
79func (p *PijulRepo) change(extraArgs ...string) ([]byte, error) {
80 return p.runPijulCmd("change", extraArgs...)
81}