@ -50,6 +50,8 @@
PrevRelPath = rebar_rel_utils : get_previous_release_path ( Config ) ,
OldVerPath = filename : join ( [ TargetParentDir , PrevRelPath ] ) ,
ModDeps = rebar_config : get ( Config , module_deps , [ ] ) ,
% % Get the new and old release name and versions
{ Name , _ Ver } = rebar_rel_utils : get_reltool_release_info ( ReltoolConfig ) ,
NewVerPath = filename : join ( [ TargetParentDir , Name ] ) ,
@ -77,7 +79,7 @@
UpgradeApps = genappup_which_apps ( Upgraded , AppUpApps ) ,
% % Generate appup files for upgraded apps
generate_appup_files ( NewVerPath , OldVerPath , UpgradeApps ) ,
generate_appup_files ( NewVerPath , OldVerPath , ModDeps , UpgradeApps) ,
{ ok , Config1 } .
@ -139,9 +141,9 @@ genappup_which_apps(UpgradedApps, [First|Rest]) ->
genappup_which_apps ( Apps , [ ] ) - >
Apps .
generate_appup_files ( NewVerPath , OldVerPath , [ { _ App , { undefined , _ } } | Rest ] ) - >
generate_appup_files ( NewVerPath , OldVerPath , Rest ) ;
generate_appup_files ( NewVerPath , OldVerPath , [ { App , { OldVer , NewVer } } | Rest ] ) - >
generate_appup_files ( NewVerPath , OldVerPath , ModDeps , [ { _ App , { undefined , _ } } | Rest ] ) - >
generate_appup_files ( NewVerPath , OldVerPath , ModDeps , Rest) ;
generate_appup_files ( NewVerPath , OldVerPath , ModDeps , [ { App , { OldVer , NewVer } } | Rest ] ) - >
OldEbinDir = filename : join ( [ OldVerPath , " lib " ,
atom_to_list ( App ) ++ " - " ++ OldVer , " ebin " ] ) ,
NewEbinDir = filename : join ( [ NewVerPath , " lib " ,
@ -150,9 +152,14 @@ generate_appup_files(NewVerPath, OldVerPath, [{App, {OldVer, NewVer}}|Rest]) ->
{ AddedFiles , DeletedFiles , ChangedFiles } = beam_lib : cmp_dirs ( NewEbinDir ,
OldEbinDir ) ,
ChangedNames = [ list_to_atom ( file_to_name ( F ) ) | | { F , _ } < - ChangedFiles ] ,
ModDeps1 = [ { N , [ M1 | | M1 < - M , lists : member ( M1 , ChangedNames ) ] }
| | { N , M } < - ModDeps ] ,
Added = [ generate_instruction ( added , File ) | | File < - AddedFiles ] ,
Deleted = [ generate_instruction ( deleted , File ) | | File < - DeletedFiles ] ,
Changed = [ generate_instruction ( changed , File ) | | File < - ChangedFiles ] ,
Changed = [ generate_instruction ( changed , ModDeps1 , File )
| | File < - ChangedFiles ] ,
Inst = lists : append ( [ Added , Deleted , Changed ] ) ,
@ -164,8 +171,8 @@ generate_appup_files(NewVerPath, OldVerPath, [{App, {OldVer, NewVer}}|Rest]) ->
OldVer , Inst , OldVer ] ) ) ,
? CONSOLE ( " Generated appup for ~p ~n " , [ App ] ) ,
generate_appup_files ( NewVerPath , OldVerPath , Rest ) ;
generate_appup_files ( _ , _ , [ ] ) - >
generate_appup_files ( NewVerPath , OldVerPath , ModDeps , Rest) ;
generate_appup_files ( _ , _ , _ , [] ) - >
? CONSOLE ( " Appup generation complete ~n " , [ ] ) .
generate_instruction ( added , File ) - >
@ -173,25 +180,27 @@ generate_instruction(added, File) ->
{ add_module , Name } ;
generate_instruction ( deleted , File ) - >
Name = list_to_atom ( file_to_name ( File ) ) ,
{ delete_module , Name } ;
generate_instruction ( changed , { File , _ } ) - >
{ delete_module , Name } .
generate_instruction ( changed , ModDeps , { File , _ } ) - >
{ ok , { Name , List } } = beam_lib : chunks ( File , [ attributes , exports ] ) ,
Behavior = get_behavior ( List ) ,
CodeChange = is_code_change ( List ) ,
generate_instruction_advanced ( Name , Behavior , CodeChange ) .
Deps = proplists : get_value ( Name , ModDeps , [ ] ) ,
generate_instruction_advanced ( Name , Behavior , CodeChange , Deps ) .
generate_instruction_advanced ( Name , undefined , undefined ) - >
generate_instruction_advanced ( Name , undefined , undefined , Deps ) - >
% % Not a behavior or code change , assume purely functional
{ load_module , Name } ;
generate_instruction_advanced ( Name , [ supervisor ] , _ ) - >
{ load_module , Name , Deps };
generate_instruction_advanced ( Name , [ supervisor ] , _ , _ ) - >
% % Supervisor
{ update , Name , supervisor } ;
generate_instruction_advanced ( Name , _ , code_change ) - >
generate_instruction_advanced ( Name , _ , code_change , Deps ) - >
% % Includes code_change export
{ update , Name , { advanced , [ ] } } ;
generate_instruction_advanced ( Name , _ , _ ) - >
{ update , Name , { advanced , [ ] } , Deps };
generate_instruction_advanced ( Name , _ , _ , Deps ) - >
% % Anything else
{ load_module , Name } .
{ load_module , Name , Deps }.
get_behavior ( List ) - >
Attributes = proplists : get_value ( attributes , List ) ,