@ -137,7 +137,7 @@ handle_deps(Profile, State0, Deps, Upgrade, Locks) ->
Registry = rebar_packages : registry ( State0 ) ,
State = rebar_state : packages ( rebar_state : registry ( State0 , Registry ) , { Packages , Graph } ) ,
% % Split source deps from pkg deps , needed to keep backwards compatibility
DepsDir = rebar_dir : deps_dir ( Stat e) ,
DepsDir = profile_dep_dir ( State , Profil e) ,
{ SrcDeps , PkgDeps } = parse_deps ( DepsDir , Deps , State , Locks , 0 ) ,
% % Fetch transitive src deps
@ -203,7 +203,7 @@ update_pkg_deps(Profile, Packages, PkgDeps, Graph, Upgrade, Seen, State) ->
update_pkg_deps ( Profile , Pkgs , Packages , Upgrade , Seen , State ) - >
% % Create app_info record for each pkg dep
DepsDir = rebar_dir : deps_dir ( Stat e) ,
DepsDir = profile_dep_dir ( State , Profil e) ,
{ Solved , _ , State1 }
= lists : foldl ( fun ( Pkg , { Acc , SeenAcc , StateAcc } ) - >
handle_pkg_dep ( Profile , Pkg , Packages , Upgrade , DepsDir , Acc , SeenAcc , StateAcc )
@ -214,7 +214,7 @@ handle_pkg_dep(Profile, Pkg, Packages, Upgrade, DepsDir, Fetched, Seen, State) -
AppInfo = package_to_app ( DepsDir , Packages , Pkg ) ,
Level = rebar_app_info : dep_level ( AppInfo ) ,
{ NewSeen , NewState } = maybe_lock ( Profile , AppInfo , Seen , State , Level ) ,
{ _ , AppInfo1 } = maybe_fetch ( AppInfo , Upgrade , Seen , NewState ) ,
{ _ , AppInfo1 } = maybe_fetch ( AppInfo , Profile , Upgrade, Seen , NewState ) ,
{ [ AppInfo1 | Fetched ] , NewSeen , NewState } .
maybe_lock ( Profile , AppInfo , Seen , State , Level ) - >
@ -252,7 +252,7 @@ package_to_app(DepsDir, Packages, {Name, Vsn, Level}) ->
| | { PkgName , PkgVsn } < - proplists : get_value ( < < " deps " > > , P , [ ] ) ] ,
{ ok , AppInfo } = rebar_app_info : new ( Name , Vsn ) ,
AppInfo1 = rebar_app_info : deps ( AppInfo , PkgDeps ) ,
AppInfo2 = rebar_app_info : dir ( AppInfo1 , rebar_dir : deps_dir ( DepsDir , Name ) ) ,
AppInfo2 = rebar_app_info : dir ( AppInfo1 , filename : join ( [ DepsDir , Name ] ) ) ,
AppInfo3 = rebar_app_info : dep_level ( AppInfo2 , Level ) ,
rebar_app_info : source ( AppInfo3 , { pkg , Name , Vsn } )
end .
@ -278,7 +278,7 @@ update_src_dep(AppInfo, Profile, Level, SrcDeps, PkgDeps, SrcApps, State, Upgrad
Name = rebar_app_info : name ( AppInfo ) ,
case sets : is_element ( Name , Seen ) of
true - >
update_seen_src_dep ( AppInfo , Level ,
update_seen_src_dep ( AppInfo , Profile , Level,
SrcDeps , PkgDeps , SrcApps ,
State , Upgrade , Seen , BaseLocks , Locks ) ;
false - >
@ -288,7 +288,13 @@ update_src_dep(AppInfo, Profile, Level, SrcDeps, PkgDeps, SrcApps, State, Upgrad
end .
update_seen_src_dep ( AppInfo , Level , SrcDeps , PkgDeps , SrcApps , State , Upgrade , Seen , BaseLocks , Locks ) - >
profile_dep_dir ( State , Profile ) - >
case Profile of
default - > filename : join ( [ rebar_dir : profile_dir ( State , [ default ] ) , rebar_state : get ( State , deps_dir , ? DEFAULT_DEPS_DIR ) ] ) ;
_ - > rebar_dir : deps_dir ( State )
end .
update_seen_src_dep ( AppInfo , Profile , Level , SrcDeps , PkgDeps , SrcApps , State , Upgrade , Seen , BaseLocks , Locks ) - >
Name = rebar_app_info : name ( AppInfo ) ,
% % If seen from lock file don ' t print warning about skipping
case lists : keymember ( Name , 1 , BaseLocks ) of
@ -303,7 +309,7 @@ update_seen_src_dep(AppInfo, Level, SrcDeps, PkgDeps, SrcApps, State, Upgrade, S
{ SrcDeps , PkgDeps , SrcApps , State , Seen , Locks } ;
true - >
{ NewSrcDeps , NewPkgDeps , NewSrcApps , NewState , NewLocks }
= handle_dep ( AppInfo , SrcDeps , PkgDeps , SrcApps ,
= handle_dep ( AppInfo , Profile , SrcDeps, PkgDeps , SrcApps ,
Level , State , Locks ) ,
{ NewSrcDeps , NewPkgDeps , NewSrcApps , NewState , Seen , NewLocks }
end .
@ -313,22 +319,22 @@ update_unseen_src_dep(AppInfo, Profile, Level, SrcDeps, PkgDeps, SrcApps, State,
{ NewSrcDeps , NewPkgDeps , NewSrcApps , State2 , NewLocks }
= case Upgrade of
true - >
handle_upgrade ( AppInfo , SrcDeps , PkgDeps , SrcApps ,
handle_upgrade ( AppInfo , Profile , SrcDeps, PkgDeps , SrcApps ,
Level , State1 , Locks ) ;
_ - >
{ _ , AppInfo1 } = maybe_fetch ( AppInfo , false , Seen , State1 ) ,
handle_dep ( AppInfo1 , SrcDeps , PkgDeps , SrcApps ,
{ _ , AppInfo1 } = maybe_fetch ( AppInfo , Profile , false , Seen , State1 ) ,
handle_dep ( AppInfo1 , Profile , SrcDeps, PkgDeps , SrcApps ,
Level , State1 , Locks )
end ,
{ NewSrcDeps , NewPkgDeps , NewSrcApps , State2 , NewSeen , NewLocks } .
handle_upgrade ( AppInfo , SrcDeps , PkgDeps , SrcApps , Level , State , Locks ) - >
handle_upgrade ( AppInfo , Profile , SrcDeps, PkgDeps , SrcApps , Level , State , Locks ) - >
Name = rebar_app_info : name ( AppInfo ) ,
case lists : keyfind ( Name , 1 , Locks ) of
false - >
case maybe_fetch ( AppInfo , true , sets : new ( ) , State ) of
case maybe_fetch ( AppInfo , Profile , true , sets : new ( ) , State ) of
{ true , AppInfo1 } - >
handle_dep ( AppInfo1 , SrcDeps , PkgDeps , SrcApps ,
handle_dep ( AppInfo1 , Profile , SrcDeps, PkgDeps , SrcApps ,
Level , State , Locks ) ;
{ false , AppInfo1 } - >
@ -338,8 +344,8 @@ handle_upgrade(AppInfo, SrcDeps, PkgDeps, SrcApps, Level, State, Locks) ->
{ [ AppInfo | SrcDeps ] , PkgDeps , SrcApps , State , Locks }
end .
handle_dep ( AppInfo , SrcDeps , PkgDeps , SrcApps , Level , State , Locks ) - >
DepsDir = rebar_dir : deps_dir ( Stat e) ,
handle_dep ( AppInfo , Profile , SrcDeps, PkgDeps , SrcApps , Level , State , Locks ) - >
DepsDir = profile_dep_dir ( State , Profil e) ,
{ AppInfo1 , NewSrcDeps , NewPkgDeps , NewLocks , State1 } =
handle_dep ( State , DepsDir , AppInfo , Locks , Level ) ,
AppInfo2 = rebar_app_info : dep_level ( AppInfo1 , Level ) ,
@ -374,9 +380,9 @@ handle_dep(State, DepsDir, AppInfo, Locks, Level) ->
{ SrcDeps , PkgDeps } = parse_deps ( DepsDir , Deps , S3 , Locks , Level ) ,
{ AppInfo2 , SrcDeps , PkgDeps , Locks ++ NewLocks , State1 } .
- spec maybe_fetch ( rebar_app_info : t ( ) , boolean ( ) | { true , binary ( ) , integer ( ) } ,
- spec maybe_fetch ( rebar_app_info : t ( ) , atom ( ) , boolean( ) | { true , binary ( ) , integer ( ) } ,
sets : set ( binary ( ) ) , rebar_state : t ( ) ) - > { boolean ( ) , rebar_app_info : t ( ) } .
maybe_fetch ( AppInfo , Upgrade , Seen , State ) - >
maybe_fetch ( AppInfo , Profile , Upgrade, Seen , State ) - >
AppDir = ec_cnv : to_list ( rebar_app_info : dir ( AppInfo ) ) ,
% % Don ' t fetch dep if it exists in the _ checkouts dir
case rebar_app_info : is_checkout ( AppInfo ) of
@ -385,16 +391,26 @@ maybe_fetch(AppInfo, Upgrade, Seen, State) ->
false - >
case rebar_app_discover : find_app ( AppDir , all ) of
false - >
case in_default ( AppInfo , State ) of
case already_ in_default( AppInfo , State ) of
false - >
{ fetch_app ( AppInfo , AppDir , State ) , AppInfo } ;
case fetch_app ( AppInfo , AppDir , State ) of
true - >
case needs_symlinking ( State , Profile ) of
true - >
SymDir = filename : join ( [ rebar_dir : deps_dir ( State ) , rebar_app_info : name ( AppInfo ) ] ) ,
symlink_dep ( AppDir , SymDir ) ,
{ true , AppInfo } ;
false - >
{ true , AppInfo }
end ;
Other - >
{ Other , AppInfo }
end ;
{ true , FoundApp } - >
% % Preserve the state we created with overrides
AppState = rebar_app_info : state ( AppInfo ) ,
FoundApp1 = rebar_app_info : state ( FoundApp , AppState ) ,
? INFO ( " Linking ~s to ~s " , [ rebar_app_info : dir ( FoundApp1 ) , AppDir ] ) ,
filelib : ensure_dir ( AppDir ) ,
rebar_file_utils : symlink_or_copy ( rebar_app_info : dir ( FoundApp1 ) , AppDir ) ,
symlink_dep ( rebar_app_info : dir ( FoundApp1 ) , AppDir ) ,
{ true , FoundApp1 }
end ;
{ true , AppInfo1 } - >
@ -410,11 +426,30 @@ maybe_fetch(AppInfo, Upgrade, Seen, State) ->
end
end .
in_default ( AppInfo , State ) - >
already_ in_default( AppInfo , State ) - >
Name = ec_cnv : to_list ( rebar_app_info : name ( AppInfo ) ) ,
DefaultAppDir = filename : join ( [ rebar_state : get ( State , base_dir ) , " default " , " lib " , Name ] ) ,
rebar_app_discover : find_app ( DefaultAppDir , all ) .
needs_symlinking ( State , Profile ) - >
case { rebar_state : current_profiles ( State ) , Profile } of
{ [ default ] , default } - >
% % file will be in default already -- this is the only run we have
false ;
{ _ , default } - >
% % file fetched to default , needs to be linked to the current
% % run ' s directory .
true ;
_ - >
% % File fetched to the right directory already
false
end .
symlink_dep ( From , To ) - >
? INFO ( " Linking ~s to ~s " , [ From , To ] ) ,
filelib : ensure_dir ( To ) ,
rebar_file_utils : symlink_or_copy ( From , To ) .
- spec parse_deps ( binary ( ) , list ( ) , rebar_state : t ( ) , list ( ) , integer ( ) ) - > { [ rebar_app_info : t ( ) ] , [ pkg_dep ( ) ] } .
parse_deps ( DepsDir , Deps , State , Locks , Level ) - >
lists : foldl ( fun ( Dep , Acc ) - >