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

numtide / treefmt / 13988944872

21 Mar 2025 09:44AM UTC coverage: 33.684% (-0.5%) from 34.211%
13988944872

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 41 new or added lines in 2 files covered. (12.2%)

577 of 1713 relevant lines covered (33.68%)

13.79 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
        //nolint:wrapcheck
25
        // run treefmt on the first three arguments: current, base and other
NEW
26
        if err := format.Run(v, statz, cmd, args[:3]); err != nil {
×
NEW
27
                return err
×
NEW
28
        }
×
29

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

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

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

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

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

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

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

NEW
65
        return nil
×
66
}
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