diff --git a/contrib/editmergeps.bat b/contrib/editmergeps.bat new file mode 100644 --- /dev/null +++ b/contrib/editmergeps.bat @@ -0,0 +1,2 @@ +@echo off +powershell -NoProfile -ExecutionPolicy unrestricted -Command "& 'editmergeps.ps1' %*" diff --git a/contrib/editmergeps.ps1 b/contrib/editmergeps.ps1 new file mode 100644 --- /dev/null +++ b/contrib/editmergeps.ps1 @@ -0,0 +1,69 @@ +# A simple script for opening merge conflicts in editor +# A loose translation of contrib/editmerge to powershell +# Please make sure that both editmergeps.bat and editmerge.ps1 are available +# via %PATH% and use the following Mercurial settings to enable it +# +# [ui] +# editmergeps +# editmergeps.args=$output +# editmergeps.check=changed +# editmergeps.premerge=keep + +$file=$args[0] + +function Get-Lines +{ + Select-String "^<<<<<<" $file | % {"$($_.LineNumber)"} +} + +$ed = $Env:HGEDITOR; +if ($ed -eq $nil) +{ + $ed = $Env:VISUAL; +} +if ($ed -eq $nil) +{ + $ed = $Env:EDITOR; +} +if ($ed -eq $nil) +{ + $ed = $(hg showconfig ui.editor); +} +if ($ed -eq $nil) +{ + Write-Error "merge failed - unable to find editor" + exit 1 +} + +if (($ed -eq "vim") -or ($ed -eq "emacs") -or ($ed -eq "nano")) +{ + $lines = Get-Lines + $firstline = if ($lines.Length -gt 0) { $lines[0] } else { $nil } + $previousline = $nil; + + + # open the editor to the first conflict until there are no more + # or the user stops editing the file + while (($firstline -ne $nil) -and ($firstline -ne $previousline)) + { + & "$ed" "+$firstline" "$file" + $previousline = $firstline + $lines = Get-Lines + $firstline = if ($lines.Length -gt 0) { $lines[0] } else { $nil } + Write-Output "firstline is: $firstline, previousline is: $previousline" + } +} +else +{ + $ "$ed" $file +} + +$conflicts=Get-Lines +if ($conflicts.Length -ne 0) +{ + Write-Output "merge failed - resolve the conflicts (line $conflicts) then use 'hg resolve --mark'" + exit 1 +} + +exit 0 +