diff --git a/inttest/appup_src/appup_src_rt.erl b/inttest/appup_src/appup_src_rt.erl index 43d3c5d..2ca6788 100644 --- a/inttest/appup_src/appup_src_rt.erl +++ b/inttest/appup_src/appup_src_rt.erl @@ -47,11 +47,11 @@ run(Dir) -> retest_log:log(debug, "Generated ebin/app.appup~n", []), %% check that ebin/app.appup has expected version - {ok, [{AppVersion, [{UpgradeFrom, _}], [{DowngradeTo, _}]}]} = + {ok, [{AppVersion, [{UpgradeFrom, _} | _UpgradeFromRest], [{DowngradeTo, _} | _DowngradeToRest]}]} = file:consult("ebin/app.appup"), - ?assertEqual(AppVersion, "1.2.2"), - ?assertEqual(UpgradeFrom, "1.2.1"), - ?assertEqual(DowngradeTo, "1.2.1"), + ?assertEqual(AppVersion, "%VSN%"), + ?assertEqual(UpgradeFrom, "1.3"), + ?assertEqual(DowngradeTo, "1.3"), ok. has_line([], _RE) -> diff --git a/inttest/appup_src/src/app.appup.src b/inttest/appup_src/src/app.appup.src index 1ca946a..a094f59 100644 --- a/inttest/appup_src/src/app.appup.src +++ b/inttest/appup_src/src/app.appup.src @@ -1,6 +1,162 @@ -{"1.2.2", - [{"1.2.1", - [{update,proc1,{advanced,[]},[]}, - {update,proc2,{advanced,[]},[]}] - }], - [{"1.2.1", []}]}. +{"%VSN%", + [ + {"1.3", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {add_module, asn1rt_per_bin}, + {add_module, asn1rt_check}, + {add_module, asn1rt_per_bin_rt2ct}, + {add_module, asn1rt_ber_bin_v2}, + {add_module, asn1rt_driver_handler}, + {remove, {asn1rt_ber_v1, soft_purge, soft_purge}} + ] + }, + {"1.3.1", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {add_module, asn1rt_per_bin}, + {add_module, asn1rt_check}, + {add_module, asn1rt_per_bin_rt2ct}, + {add_module, asn1rt_ber_bin_v2}, + {add_module, asn1rt_driver_handler}, + {remove, {asn1rt_ber_v1, soft_purge, soft_purge}} + ] + }, + {"1.3.1.1", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {add_module, asn1rt_per_bin}, + {add_module, asn1rt_check}, + {add_module, asn1rt_per_bin_rt2ct}, + {add_module, asn1rt_ber_bin_v2}, + {add_module, asn1rt_driver_handler}, + {remove, {asn1rt_ber_v1, soft_purge, soft_purge}} + ] + }, + {"1.3.2", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_check, soft_purge, soft_purge, []}, + {add_module, asn1rt_per_bin_rt2ct}, + {add_module, asn1rt_ber_bin_v2}, + {add_module, asn1rt_driver_handler}, + {remove, {asn1rt_ber_v1, soft_purge, soft_purge}} + ] + }, + {"1.3.3", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_check, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []}, + {add_module, asn1rt_ber_bin_v2}, + {add_module, asn1rt_driver_handler}, + {remove, {asn1rt_ber_v1, soft_purge, soft_purge}} + ] + }, + {"1.3.3.1", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_check, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []}, + {add_module, asn1rt_ber_bin_v2}, + {add_module, asn1rt_driver_handler}, + {remove, {asn1rt_ber_v1, soft_purge, soft_purge}} + ] + } + ], + [ + {"1.3", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {add_module, asn1rt_ber_v1}, + {remove, {asn1rt_per_bin, soft_purge, soft_purge}}, + {remove, {asn1rt_check, soft_purge, soft_purge}}, + {remove, {asn1rt_per_bin_rt2ct, soft_purge, soft_purge}}, + {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}}, + {remove, {asn1rt_driver_handler, soft_purge, soft_purge}} + ] + }, + {"1.3.1", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {add_module, asn1rt_ber_v1}, + {remove, {asn1rt_per_bin, soft_purge, soft_purge}}, + {remove, {asn1rt_check, soft_purge, soft_purge}}, + {remove, {asn1rt_per_bin_rt2ct, soft_purge, soft_purge}}, + {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}}, + {remove, {asn1rt_driver_handler, soft_purge, soft_purge}} + ] + }, + {"1.3.1.1", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {add_module, asn1rt_ber_v1}, + {remove, {asn1rt_per_bin, soft_purge, soft_purge}}, + {remove, {asn1rt_check, soft_purge, soft_purge}}, + {remove, {asn1rt_per_bin_rt2ct, soft_purge, soft_purge}}, + {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}}, + {remove, {asn1rt_driver_handler, soft_purge, soft_purge}} + ] + }, + {"1.3.2", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_check, soft_purge, soft_purge, []}, + {add_module, asn1rt_ber_v1}, + {remove, {asn1rt_per_bin_rt2ct, soft_purge, soft_purge}}, + {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}}, + {remove, {asn1rt_driver_handler, soft_purge, soft_purge}} + ] + }, + {"1.3.3", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_check, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []}, + {add_module, asn1rt_ber_v1}, + {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}}, + {remove, {asn1rt_driver_handler, soft_purge, soft_purge}} + ] + }, + {"1.3.3.1", + [ + {load_module, asn1rt_per_v1, soft_purge, soft_purge, []}, + {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin, soft_purge, soft_purge, []}, + {load_module, asn1rt_check, soft_purge, soft_purge, []}, + {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []}, + {add_module, asn1rt_ber_v1}, + {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}}, + {remove, {asn1rt_driver_handler, soft_purge, soft_purge}} + ] + } + + ]}. diff --git a/inttest/appup_src_2/appup_src_2_rt.erl b/inttest/appup_src_2/appup_src_2_rt.erl new file mode 100644 index 0000000..09d2503 --- /dev/null +++ b/inttest/appup_src_2/appup_src_2_rt.erl @@ -0,0 +1,65 @@ +%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 et +%% ------------------------------------------------------------------- +%% +%% rebar: Erlang Build Tools +%% +%% Copyright (c) 2015 Luis Rascao (luis.rascao@gmail.com) +%% +%% Permission is hereby granted, free of charge, to any person obtaining a copy +%% of this software and associated documentation files (the "Software"), to deal +%% in the Software without restriction, including without limitation the rights +%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%% copies of the Software, and to permit persons to whom the Software is +%% furnished to do so, subject to the following conditions: +%% +%% The above copyright notice and this permission notice shall be included in +%% all copies or substantial portions of the Software. +%% +%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +%% THE SOFTWARE. +%% ------------------------------------------------------------------- +-module(appup_src_2_rt). + +-compile(export_all). + +-include_lib("eunit/include/eunit.hrl"). + +files() -> + [{copy, "../../rebar", "rebar"}, + {copy, "src", "src"}]. + +run(Dir) -> + retest_log:log(debug, "Running in Dir: ~s~n", [Dir]), + {ok, [_Pid|Output]} = retest:sh("./rebar compile -vv", + [{async, false}]), + + LineRegexp = "Compiled src/app\.appup\.src", + ?assertEqual(true, has_line(Output, LineRegexp)), + + %% check that ebin/app.appup exists + ?assertMatch(true, filelib:is_regular("ebin/app.appup")), + retest_log:log(debug, "Generated ebin/app.appup~n", []), + + %% check that ebin/app.appup has expected version + {ok, [{AppVersion, [], []}]} = + file:consult("ebin/app.appup"), + ?assertEqual(AppVersion, "1.24"), + ok. + +has_line([], _RE) -> + false; +has_line([L|T], RE) -> + case re:run(L, RE, []) of + {match, _Captured} -> + true; + match -> + true; + nomatch -> + has_line(T, RE) + end. diff --git a/inttest/appup_src_2/appup_src_rt_2.erl b/inttest/appup_src_2/appup_src_rt_2.erl new file mode 100644 index 0000000..d662183 --- /dev/null +++ b/inttest/appup_src_2/appup_src_rt_2.erl @@ -0,0 +1,67 @@ +%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 et +%% ------------------------------------------------------------------- +%% +%% rebar: Erlang Build Tools +%% +%% Copyright (c) 2015 Luis Rascao (luis.rascao@gmail.com) +%% +%% Permission is hereby granted, free of charge, to any person obtaining a copy +%% of this software and associated documentation files (the "Software"), to deal +%% in the Software without restriction, including without limitation the rights +%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%% copies of the Software, and to permit persons to whom the Software is +%% furnished to do so, subject to the following conditions: +%% +%% The above copyright notice and this permission notice shall be included in +%% all copies or substantial portions of the Software. +%% +%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +%% THE SOFTWARE. +%% ------------------------------------------------------------------- +-module(appup_src_rt_2). + +-compile(export_all). + +-include_lib("eunit/include/eunit.hrl"). + +files() -> + [{copy, "../../rebar", "rebar"}, + {copy, "src", "src"}]. + +run(Dir) -> + retest_log:log(debug, "Running in Dir: ~s~n", [Dir]), + {ok, [_Pid|Output]} = retest:sh("./rebar compile -vv", + [{async, false}]), + + LineRegexp = "Compiled src/app\.appup\.src", + ?assertEqual(true, has_line(Output, LineRegexp)), + + %% check that ebin/app.appup exists + ?assertMatch(true, filelib:is_regular("ebin/app.appup")), + retest_log:log(debug, "Generated ebin/app.appup~n", []), + + %% check that ebin/app.appup has expected version + {ok, [{AppVersion, [{UpgradeFrom, _}], [{DowngradeTo, _}]}]} = + file:consult("ebin/app.appup"), + ?assertEqual(AppVersion, "1.2.2"), + ?assertEqual(UpgradeFrom, "1.2.1"), + ?assertEqual(DowngradeTo, "1.2.1"), + ok. + +has_line([], _RE) -> + false; +has_line([L|T], RE) -> + case re:run(L, RE, []) of + {match, _Captured} -> + true; + match -> + true; + nomatch -> + has_line(T, RE) + end. diff --git a/inttest/appup_src_2/src/app.app.src b/inttest/appup_src_2/src/app.app.src new file mode 100644 index 0000000..9a63bb3 --- /dev/null +++ b/inttest/appup_src_2/src/app.app.src @@ -0,0 +1,5 @@ +{application, app, + [{vsn, "1"}, + {modules, []}, + {registered, []}, + {applications, [kernel, stdlib]}]}. diff --git a/inttest/appup_src_2/src/app.appup.src b/inttest/appup_src_2/src/app.appup.src new file mode 100644 index 0000000..ca647e5 --- /dev/null +++ b/inttest/appup_src_2/src/app.appup.src @@ -0,0 +1,4 @@ +{"1.24", + [], + [] +}. diff --git a/inttest/appup_src_2/src/appup_src.erl b/inttest/appup_src_2/src/appup_src.erl new file mode 100644 index 0000000..6f4d0d7 --- /dev/null +++ b/inttest/appup_src_2/src/appup_src.erl @@ -0,0 +1,6 @@ +-module(appup_src). + +-compile(export_all). + +test() -> + ok. diff --git a/src/rebar_otp_appup.erl b/src/rebar_otp_appup.erl index a97044f..36fd353 100644 --- a/src/rebar_otp_appup.erl +++ b/src/rebar_otp_appup.erl @@ -73,7 +73,8 @@ preprocess(SourceFile, TargetFile, _Config) -> case rebar_config:consult_file(SourceFile) of %% The .appup syntax is described in %% http://erlang.org/doc/man/appup.html. - {ok, [{_Vsn, [_UpFromVsn], [_DownToVsn]} = AppUp]} -> + {ok, [{_Vsn, UpFromVsn, DownToVsn} = AppUp]} + when is_list(UpFromVsn), is_list(DownToVsn) -> case file:write_file(TargetFile, lists:flatten(io_lib:format("~p.", [AppUp]))) of {error, Reason} ->