Patchwork D9767: test: extract the `genmerges` out of test-merge-combination.t

login
register
mail settings
Submitter phabricator
Date Jan. 14, 2021, 10:52 a.m.
Message ID <differential-rev-PHID-DREV-wlt7g2j3xcsrw7hktkf6-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/48078/
State Superseded
Headers show

Comments

phabricator - Jan. 14, 2021, 10:52 a.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  This open the way to splitting this slow test in multiple ones.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D9767

AFFECTED FILES
  tests/test-merge-combination.t
  tests/testlib/merge-combination-util.sh

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/testlib/merge-combination-util.sh b/tests/testlib/merge-combination-util.sh
new file mode 100644
--- /dev/null
+++ b/tests/testlib/merge-combination-util.sh
@@ -0,0 +1,73 @@ 
+# genmerges is the workhorse of the test-merge-combination.t tests.
+
+# Given:
+# - a `range` function describing the possible values for file a
+# - a `isgood` function to filter out uninteresting combination
+# - a `createfile` function to actually write the values for file a on the
+#   filesystem
+#
+# it print a series of lines that look like: abcd C: output of -T {files}
+# describing the file a at respectively the base, p2, p1, merge
+# revision. "C" indicates that hg merge had conflicts.
+
+genmerges () {
+
+  (LC_ALL=C type range | grep -q 'shell function') || (echo >&2 "missing function: range")
+  (LC_ALL=C type isgood | grep -q 'shell function') || (echo >&2 "missing function: range")
+  (LC_ALL=C type createfile | grep -q 'shell function') || (echo >&2 "missing function: range")
+
+  for base in `range` -; do
+    for r1 in `range $base` -; do
+      for r2 in `range $base $r1` -; do
+        for m in `range $base $r1 $r2` -; do
+          line="$base$r1$r2$m"
+          isgood $line || continue
+          hg init repo
+          cd repo
+          make_commit () {
+            v=$1; msg=$2; file=$3;
+            if [ $v != - ]; then
+              createfile $v
+            else
+              if [ -f a ]
+              then rm a
+              else touch $file
+              fi
+            fi
+            hg commit -q -Am $msg || exit 123
+          }
+          echo foo > foo
+          make_commit $base base b
+          make_commit $r1 r1 c
+          hg up -r 0 -q
+          make_commit $r2 r2 d
+          hg merge -q -r 1 > ../output 2>&1
+          if [ $? -ne 0 ]; then rm -f *.orig; hg resolve -m --all -q; fi
+          if [ -s ../output ]; then conflicts=" C"; else conflicts="  "; fi
+          make_commit $m m e
+          if [ $m = $r1 ] && [ $m = $r2 ]
+          then expected=
+          elif [ $m = $r1 ]
+          then if [ $base = $r2 ]
+               then expected=
+               else expected=a
+               fi
+          elif [ $m = $r2 ]
+          then if [ $base = $r1 ]
+               then expected=
+               else expected=a
+               fi
+          else expected=a
+          fi
+          got=`hg log -r 3 --template '{files}\n' | tr -d 'e '`
+          if [ "$got" = "$expected" ]
+          then echo "$line$conflicts: agree on \"$got\""
+          else echo "$line$conflicts: hg said \"$got\", expected \"$expected\""
+          fi
+          cd ../
+          rm -rf repo
+        done
+      done
+    done
+  done
+}
diff --git a/tests/test-merge-combination.t b/tests/test-merge-combination.t
--- a/tests/test-merge-combination.t
+++ b/tests/test-merge-combination.t
@@ -5,70 +5,7 @@ 
 merge ancestors, nor copies/renames, and nor identical file contents
 with different filelog revisions.
 
-genmerges is the workhorse. Given:
-- a range function describing the possible values for file a
-- a isgood function to filter out uninteresting combination
-- a createfile function to actually write the values for file a on the
-filesystem
-it print a series of lines that look like: abcd C: output of -T {files}
-describing the file a at respectively the base, p2, p1, merge
-revision. "C" indicates that hg merge had conflicts.
-  $ genmerges () {
-  >   for base in `range` -; do
-  >     for r1 in `range $base` -; do
-  >       for r2 in `range $base $r1` -; do
-  >         for m in `range $base $r1 $r2` -; do
-  >           line="$base$r1$r2$m"
-  >           isgood $line || continue
-  >           hg init repo
-  >           cd repo
-  >           make_commit () {
-  >             v=$1; msg=$2; file=$3;
-  >             if [ $v != - ]; then
-  >               createfile $v
-  >             else
-  >               if [ -f a ]
-  >               then rm a
-  >               else touch $file
-  >               fi
-  >             fi
-  >             hg commit -q -Am $msg || exit 123
-  >           }
-  >           echo foo > foo
-  >           make_commit $base base b
-  >           make_commit $r1 r1 c
-  >           hg up -r 0 -q
-  >           make_commit $r2 r2 d
-  >           hg merge -q -r 1 > ../output 2>&1
-  >           if [ $? -ne 0 ]; then rm -f *.orig; hg resolve -m --all -q; fi
-  >           if [ -s ../output ]; then conflicts=" C"; else conflicts="  "; fi
-  >           make_commit $m m e
-  >           if [ $m = $r1 ] && [ $m = $r2 ]
-  >           then expected=
-  >           elif [ $m = $r1 ]
-  >           then if [ $base = $r2 ]
-  >                then expected=
-  >                else expected=a
-  >                fi
-  >           elif [ $m = $r2 ]
-  >           then if [ $base = $r1 ]
-  >                then expected=
-  >                else expected=a
-  >                fi
-  >           else expected=a
-  >           fi
-  >           got=`hg log -r 3 --template '{files}\n' | tr -d 'e '`
-  >           if [ "$got" = "$expected" ]
-  >           then echo "$line$conflicts: agree on \"$got\""
-  >           else echo "$line$conflicts: hg said \"$got\", expected \"$expected\""
-  >           fi
-  >           cd ../
-  >           rm -rf repo
-  >         done
-  >       done
-  >     done
-  >   done
-  > }
+  $ . $TESTDIR/testlib/merge-combination-util.sh
 
 All the merges of various file contents.