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-Linesnull14function 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