Skip to content

Commit fd3a29d

Browse files
committed
fixup! Add merge options menu
1 parent 371df2f commit fd3a29d

File tree

2 files changed

+90
-18
lines changed

2 files changed

+90
-18
lines changed

pkg/commands/git_commands/working_tree.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,14 @@ func (self *WorkingTreeCommands) ResetMixed(ref string) error {
409409
return self.cmd.New(cmdArgs).Run()
410410
}
411411

412+
func (self *WorkingTreeCommands) ShowFileAtStage(path string, stage int) (string, error) {
413+
cmdArgs := NewGitCmd("show").
414+
Arg(fmt.Sprintf(":%d:%s", stage, path)).
415+
ToArgv()
416+
417+
return self.cmd.New(cmdArgs).RunWithOutput()
418+
}
419+
412420
func (self *WorkingTreeCommands) ObjectIDAtStage(path string, stage int) (string, error) {
413421
cmdArgs := NewGitCmd("rev-parse").
414422
Arg(fmt.Sprintf(":%d:%s", stage, path)).
@@ -422,11 +430,22 @@ func (self *WorkingTreeCommands) ObjectIDAtStage(path string, stage int) (string
422430
return strings.TrimSpace(output), nil
423431
}
424432

425-
func (self *WorkingTreeCommands) MergeFile(strategy string, oursID string, baseID string, theirsID string) (string, error) {
433+
func (self *WorkingTreeCommands) MergeFileForFiles(strategy string, oursFilepath string, baseFilepath string, theirsFilepath string) (string, error) {
434+
cmdArgs := NewGitCmd("merge-file").
435+
Arg(strategy).
436+
Arg("--stdout").
437+
Arg(oursFilepath, baseFilepath, theirsFilepath).
438+
ToArgv()
439+
440+
return self.cmd.New(cmdArgs).RunWithOutput()
441+
}
442+
443+
// OIDs mode (Git 2.43+)
444+
func (self *WorkingTreeCommands) MergeFileForObjectIDs(strategy string, oursID string, baseID string, theirsID string) (string, error) {
426445
cmdArgs := NewGitCmd("merge-file").
427-
Arg("--object-id").
428446
Arg(strategy).
429447
Arg("--stdout").
448+
Arg("--object-id").
430449
Arg(oursID, baseID, theirsID).
431450
ToArgv()
432451

pkg/gui/controllers/helpers/working_tree_helper.go

Lines changed: 69 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -253,25 +253,78 @@ func (self *WorkingTreeHelper) commitPrefixConfigsForRepo() []config.CommitPrefi
253253
return self.c.UserConfig().Git.CommitPrefix
254254
}
255255

256-
func (self *WorkingTreeHelper) CreateMergeConflictMenu(selectedFilepaths []string) error {
257-
onMergeStrategySelected := func(strategy string) error {
258-
for _, filepath := range selectedFilepaths {
259-
baseID, err := self.c.Git().WorkingTree.ObjectIDAtStage(filepath, 1)
260-
if err != nil {
261-
return err
262-
}
256+
func (self *WorkingTreeHelper) mergeFile(filepath string, strategy string) (string, error) {
257+
if self.c.Git().Version.IsOlderThan(2, 43, 0) {
258+
return self.mergeFileWithTempFiles(filepath, strategy)
259+
} else {
260+
return self.mergeFileWithObjectIDs(filepath, strategy)
261+
}
262+
}
263263

264-
oursID, err := self.c.Git().WorkingTree.ObjectIDAtStage(filepath, 2)
265-
if err != nil {
266-
return err
267-
}
264+
func (self *WorkingTreeHelper) mergeFileWithTempFiles(filepath string, strategy string) (string, error) {
265+
showToTempFile := func(stage int, label string) (string, error) {
266+
output, err := self.c.Git().WorkingTree.ShowFileAtStage(filepath, stage)
267+
if err != nil {
268+
return "", err
269+
}
268270

269-
theirsID, err := self.c.Git().WorkingTree.ObjectIDAtStage(filepath, 3)
270-
if err != nil {
271-
return err
272-
}
271+
f, err := os.CreateTemp("", "mergefile-"+label+"-*")
272+
if err != nil {
273+
return "", err
274+
}
275+
defer f.Close()
273276

274-
output, err := self.c.Git().WorkingTree.MergeFile(strategy, oursID, baseID, theirsID)
277+
if _, err := f.Write([]byte(output)); err != nil {
278+
return "", err
279+
}
280+
281+
return f.Name(), nil
282+
}
283+
284+
baseFilepath, err := showToTempFile(1, "base")
285+
if err != nil {
286+
return "", err
287+
}
288+
defer os.Remove(baseFilepath)
289+
290+
oursFilepath, err := showToTempFile(2, "ours")
291+
if err != nil {
292+
return "", err
293+
}
294+
defer os.Remove(oursFilepath)
295+
296+
theirsFilepath, err := showToTempFile(3, "theirs")
297+
if err != nil {
298+
return "", err
299+
}
300+
defer os.Remove(theirsFilepath)
301+
302+
return self.c.Git().WorkingTree.MergeFileForFiles(strategy, oursFilepath, baseFilepath, theirsFilepath)
303+
}
304+
305+
func (self *WorkingTreeHelper) mergeFileWithObjectIDs(filepath, strategy string) (string, error) {
306+
baseID, err := self.c.Git().WorkingTree.ObjectIDAtStage(filepath, 1)
307+
if err != nil {
308+
return "", err
309+
}
310+
311+
oursID, err := self.c.Git().WorkingTree.ObjectIDAtStage(filepath, 2)
312+
if err != nil {
313+
return "", err
314+
}
315+
316+
theirsID, err := self.c.Git().WorkingTree.ObjectIDAtStage(filepath, 3)
317+
if err != nil {
318+
return "", err
319+
}
320+
321+
return self.c.Git().WorkingTree.MergeFileForObjectIDs(strategy, oursID, baseID, theirsID)
322+
}
323+
324+
func (self *WorkingTreeHelper) CreateMergeConflictMenu(selectedFilepaths []string) error {
325+
onMergeStrategySelected := func(strategy string) error {
326+
for _, filepath := range selectedFilepaths {
327+
output, err := self.mergeFile(filepath, strategy)
275328
if err != nil {
276329
return err
277330
}

0 commit comments

Comments
 (0)