Patchwork [1,of,2,contrib] contrib: add editmerge version for powershell

login
register
mail settings
Submitter Kostia Balytskyi
Date May 18, 2017, 11:06 p.m.
Message ID <2412345e35cc0b17c98e.1495148767@devvm1416.lla2.facebook.com>
Download mbox | patch
Permalink /patch/20700/
State Accepted
Headers show

Comments

Kostia Balytskyi - May 18, 2017, 11:06 p.m.
# HG changeset patch
# User Kostia Balytskyi <ikostia@fb.com>
# Date 1495143406 25200
#      Thu May 18 14:36:46 2017 -0700
# Node ID 2412345e35cc0b17c98e050a480cb4b4f03bd5bb
# Parent  5b363e91f853c9c0f982ba02dedddd320dac0215
contrib: add editmerge version for powershell

This just adds a translation of existing contrib/editmerge to powershell.
It allows users on Windows to iteratively resolve conflicts in their
editor of choice.

Patch

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
+