• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

numtide / treefmt / 13988872417

21 Mar 2025 09:41AM UTC coverage: 33.703% (-0.5%) from 34.211%
13988872417

Pull #561

github

brianmcgee
wip: add a git-mergetool sub command

Partial implementation of #523.

Signed-off-by: Brian McGee <brian@bmcgee.ie>
Pull Request #561: wip: add a git-mergetool sub command

5 of 40 new or added lines in 2 files covered. (12.5%)

577 of 1712 relevant lines covered (33.7%)

13.8 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/cmd/git_mergetool.go
1
package cmd
2

3
import (
4
        "fmt"
5
        "os"
6
        "os/exec"
7

8
        "github.com/numtide/treefmt/v2/cmd/format"
9
        "github.com/numtide/treefmt/v2/stats"
10
        "github.com/spf13/cobra"
11
        "github.com/spf13/viper"
12
)
13

14
func gitMergetool(
15
        v *viper.Viper,
16
        statz *stats.Stats,
17
        cmd *cobra.Command,
18
        args []string,
NEW
19
) error {
×
NEW
20
        if len(args) != 4 {
×
NEW
21
                return fmt.Errorf("expected 4 arguments, got %d", len(args))
×
NEW
22
        }
×
23

24
        // run treefmt on the first three arguments: current, base and other
NEW
25
        if err := format.Run(v, statz, cmd, args[:3]); err != nil {
×
NEW
26
                return err
×
NEW
27
        }
×
28

29
        // run `git merge-file` and redirect it's output to the fourth argument: merged
NEW
30
        merged, err := os.CreateTemp("", "treefmt-git-mergetool-*")
×
NEW
31
        if err != nil {
×
NEW
32
                return fmt.Errorf("failed to create temporary merge file: %w", err)
×
NEW
33
        }
×
34

35
        // remove when we're done
NEW
36
        defer os.Remove(merged.Name())
×
NEW
37

×
NEW
38
        merge := exec.Command("git", "merge-file", "--stdout", args[0], args[1], args[2])
×
NEW
39
        // redirect stdout to the temporary merge file
×
NEW
40
        merge.Stdout = merged
×
NEW
41
        // capture stderr
×
NEW
42
        merge.Stderr = os.Stderr
×
NEW
43

×
NEW
44
        if err = merge.Run(); err != nil {
×
NEW
45
                return fmt.Errorf("failed to run git merge-file: %w", err)
×
NEW
46
        }
×
47

48
        // close the merged file
NEW
49
        if err = merged.Close(); err != nil {
×
NEW
50
                return fmt.Errorf("failed to close temporary merge file: %w", err)
×
NEW
51
        }
×
52

53
        // format the merged file
NEW
54
        if err = format.Run(v, statz, cmd, []string{merged.Name()}); err != nil {
×
NEW
55
                return fmt.Errorf("failed to format merged file: %w", err)
×
NEW
56
        }
×
57

58
        // rename temp merge file
NEW
59
        if err = os.Rename(merged.Name(), args[3]); err != nil {
×
NEW
60
                return fmt.Errorf("failed to rename temporary merge file: %w", err)
×
NEW
61
        }
×
62

NEW
63
        return nil
×
64
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc