Perl v5.26 now recognizes version control conflict markers

Perl v5.26 can now detect and warn you about a version control conflict markers in your code. In prior versions, the compiler would try to interpret those as code and would complain about a syntax error. You program still fails to compile but you get a better error message. Maybe some future Perl will bifurcate the program, run both versions, and compare the results (don’t hold your breath):

To demonstrate this, set up a new git repository, create a simple “Hello World” program, and commit it:

$ mkdir test-repo; cd test_repo; git init
Initialized empty Git repository in /Users/buster/test_repo/.git/

$ cat > hello.pl
#!/usr/bin/perl
use v5.10;
say "Hello World!";
^D

$ git add hello.pl

$  git commit -a -m 'initial program'
[master (root-commit) 0665c2b] initial program
 1 file changed, 3 insertions(+)
 create mode 100755 hello.pl

Now that you have the file you need to create a conflict that Perl can detect. One way is to edit in a new branch and the master branch at the same time.

$ git checkout -b new_feature
Switched to a new branch 'new_feature'

$  cat > hello.pl
#!/usr/bin/perl
use v5.10;
say "Hello Perl 5.26!";

$  git commit -a -m 'Greet the new perl'
[new_feature 9ed328a] Greet the new perl
 1 file changed, 1 insertion(+), 1 deletion(-)

$   git checkout master
Switched to branch 'master'

$   cat > hello.pl
#!/usr/bin/perl
use v5.10;
say "Hello new Perl!";

$  git commit -a -m 'Greet the new Perl'
[master 15dd6ac] Greet the new Perl
 1 file changed, 1 insertion(+), 1 deletion(-)

Both of these programs change the message in the say statement. Both commits have a similar message (that’s not important). You can pull from a branch to try to merge it into your current branch. You may get the same thing by pulling from a remote where someone else was working on the same file as you. The merge gives you a warning:

$ git pull . new_feature
From .
 * branch            new_feature -> FETCH_HEAD
Auto-merging hello.pl
CONFLICT (content): Merge conflict in hello.pl
Automatic merge failed; fix conflicts and then commit the result.

The file now has both versions of the file. A git conflict marker starts with <<<<<<<. That’s followed by the version for file as it exists in the current branch. The ends with =======, after which is the content for the incoming version. Finally, the end of the conflict is denoted with >>>>>>> and the commit digest for the incoming commit marked as HEAD (you know the current commit because, well, it’s the current commit: git show -s --format=%H):

$ cat hello.pl
#!/usr/bin/perl
use v5.10;
<<<<<<< HEAD
say "Hello new Perl!";
=======
say "Hello Perl 5.26!";
>>>>>>> 9ed328a5468aeab03098a4ded7a6bbc6daf8ac61

Versions prior to v5.26 give an odd error that doesn’t seem to relate to anything going on in the program. Earlier Perls think you are trying to use a heredoc:

$ perl5.24 hello.pl
Use of bare << to mean <<"" is deprecated at hello.pl line 3.

Now the error message better detects what’s going on:

$ perl5.26 hello.pl
Version control conflict marker at hello.pl line 3, near "<<<<<<<"
Version control conflict marker at hello.pl line 5, near "======="
Version control conflict marker at hello.pl line 7, near ">>>>>>>"
Execution of hello.pl aborted due to compilation errors.

Running it under diagnostics gives extra information (although it’s not always much more helpful):

$ perl -Mdiagnostics hello.pl
Version control conflict marker at hello.pl line 3, near "<<<<<<<"
Version control conflict marker at hello.pl line 5, near "======="
Version control conflict marker at hello.pl line 7, near ">>>>>>>"
Execution of hello.pl aborted due to compilation errors (#1)
    (F) The parser found a line starting with <<<<<<<,
    >>>>>>>, or =======.  These may be left by a
    version control system to mark conflicts after a failed merge operation.

Uncaught exception from user code:
	Version control conflict marker at hello.pl line 3, near "<<<<<<<"
	Version control conflict marker at hello.pl line 5, near "======="
	Version control conflict marker at hello.pl line 7, near ">>>>>>>"
	Execution of hello.pl aborted due to compilation errors.