1 # A simple script for opening merge conflicts in editor
2 # A loose translation of contrib/editmerge to powershell
3 # Please make sure that both editmergeps.bat and editmerge.ps1 are available
4 # via %PATH% and use the following Mercurial settings to enable it
5 #
6 # [ui]
7 # editmergeps
8 # editmergeps.args=$output
9 # editmergeps.check=changed
10 # editmergeps.premerge=keep
11 
12 $file=$args[0]
13 
Get-Linesnull14 function Get-Lines
15 {
16   Select-String "^<<<<<<" $file | % {"$($_.LineNumber)"}
17 }
18 
19 $ed = $Env:HGEDITOR;
20 if ($ed -eq $nil)
21 {
22   $ed = $Env:VISUAL;
23 }
24 if ($ed -eq $nil)
25 {
26   $ed = $Env:EDITOR;
27 }
28 if ($ed -eq $nil)
29 {
30   $ed = $(hg showconfig ui.editor);
31 }
32 if ($ed -eq $nil)
33 {
34   Write-Error "merge failed - unable to find editor"
35   exit 1
36 }
37 
38 if (($ed -eq "vim") -or ($ed -eq "emacs") -or `
39     ($ed -eq "nano") -or ($ed -eq "notepad++"))
40 {
41   $lines = Get-Lines
42   $firstline = if ($lines.Length -gt 0) { $lines[0] } else { $nil }
43   $previousline = $nil;
44 
45 
46   # open the editor to the first conflict until there are no more
47   # or the user stops editing the file
48   while (($firstline -ne $nil) -and ($firstline -ne $previousline))
49   {
50     if ($ed -eq "notepad++")
51     {
52         $linearg = "-n$firstline"
53     }
54     else
55     {
56         $linearg = "+$firstline"
57     }
58 
59     Start-Process -Wait -NoNewWindow $ed $linearg,$file
60     $previousline = $firstline
61     $lines = Get-Lines
62     $firstline = if ($lines.Length -gt 0) { $lines[0] } else { $nil }
63   }
64 }
65 else
66 {
67   & "$ed" $file
68 }
69 
70 $conflicts=Get-Lines
71 if ($conflicts.Length -ne 0)
72 {
73   Write-Output "merge failed - resolve the conflicts (line $conflicts) then use 'hg resolve --mark'"
74   exit 1
75 }
76 
77 exit 0
78 
79