From e321ca64981504f10a3be1715ce5d94c3cd10ae7 Mon Sep 17 00:00:00 2001
From: Fred Hebert <mononcqc@ferd.ca>
Date: Wed, 2 May 2018 23:53:29 -0400
Subject: [PATCH] Fix handling of loosely formatted OTP_VERSION file

see https://github.com/erlang/rebar3/issues/1774
---
 src/rebar_utils.erl | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index a911cc284..604abb88c 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -506,11 +506,10 @@ otp_release1(Rel) ->
             %% It's fine to rely on the binary module here because we can
             %% be sure that it's available when the otp_release string does
             %% not begin with $R.
-            Size = byte_size(Vsn),
             %% The shortest vsn string consists of at least two digits
             %% followed by "\n". Therefore, it's safe to assume Size >= 3.
-            case binary:part(Vsn, {Size, -3}) of
-                <<"**\n">> ->
+            case binary:match(Vsn, <<"**">>) of
+                {Pos, _} ->
                     %% The OTP documentation mentions that a system patched
                     %% using the otp_patch_apply tool available to licensed
                     %% customers will leave a '**' suffix in the version as a
@@ -519,9 +518,9 @@ otp_release1(Rel) ->
                     %% drop the suffix, given for all intents and purposes, we
                     %% cannot obtain relevant information from it as far as
                     %% tooling is concerned.
-                    binary:bin_to_list(Vsn, {0, Size - 3});
-                _ ->
-                    binary:bin_to_list(Vsn, {0, Size - 1})
+                    binary:bin_to_list(Vsn, {0, Pos});
+                nomatch ->
+                    rebar_string:trim(binary:bin_to_list(Vsn), trailing, "\n")
             end
     end.