浏览代码

Run pkg updates on plugin upgrades

Upgrading dependencies already checked for package updates before running
the upgrade task. Plugins didn't have that mechanism in place and that
made upgrading plugins over hex trickier since users could be stuck a
long time without running an update manually.

This fix mostly readapts existing dep code to the context of plugins to
look them up one at a time and run the update as part of the upgrade.
pull/2389/head
Fred Hebert 4 年前
父节点
当前提交
09df513a7f
共有 2 个文件被更改,包括 28 次插入6 次删除
  1. +1
    -6
      src/rebar_pkg_resource.erl
  2. +27
    -0
      src/rebar_prv_plugins_upgrade.erl

+ 1
- 6
src/rebar_pkg_resource.erl 查看文件

@ -60,12 +60,7 @@ lock(AppInfo, _) ->
Res :: boolean(). Res :: boolean().
needs_update(AppInfo, _) -> needs_update(AppInfo, _) ->
{pkg, _Name, Vsn, _OldHash, _Hash, _} = rebar_app_info:source(AppInfo), {pkg, _Name, Vsn, _OldHash, _Hash, _} = rebar_app_info:source(AppInfo),
case rebar_utils:to_binary(rebar_app_info:original_vsn(AppInfo)) =:= rebar_utils:to_binary(Vsn) of
true ->
false;
false ->
true
end.
rebar_utils:to_binary(rebar_app_info:original_vsn(AppInfo)) =/= rebar_utils:to_binary(Vsn).
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------
%% @doc %% @doc

+ 27
- 0
src/rebar_prv_plugins_upgrade.erl 查看文件

@ -62,6 +62,7 @@ upgrade(Plugin, State) ->
?PRV_ERROR({not_found, Plugin}); ?PRV_ERROR({not_found, Plugin});
{ok, P, Profile} -> {ok, P, Profile} ->
State1 = rebar_state:set(State, deps_dir, ?DEFAULT_PLUGINS_DIR), State1 = rebar_state:set(State, deps_dir, ?DEFAULT_PLUGINS_DIR),
maybe_update_pkg(P, State1),
{Apps, State2} = rebar_prv_install_deps:handle_deps_as_profile(Profile, State1, [P], true), {Apps, State2} = rebar_prv_install_deps:handle_deps_as_profile(Profile, State1, [P], true),
{no_cycle, Sorted} = rebar_prv_install_deps:find_cycles(Apps), {no_cycle, Sorted} = rebar_prv_install_deps:find_cycles(Apps),
@ -92,3 +93,29 @@ find_plugin(Plugin, Profiles, State) ->
build_plugin(ToBuild, State) -> build_plugin(ToBuild, State) ->
Providers = rebar_state:providers(State), Providers = rebar_state:providers(State),
rebar_prv_compile:compile(State, Providers, ToBuild, plugins). rebar_prv_compile:compile(State, Providers, ToBuild, plugins).
maybe_update_pkg(Name, State) ->
try rebar_app_utils:parse_dep(root, ?DEFAULT_PLUGINS_DIR, Name, State, [], 0) of
AppInfo ->
Source = rebar_app_info:source(AppInfo),
case element(1, Source) of
pkg ->
Resources = rebar_state:resources(State),
#{repos := RepoConfigs} = rebar_resource_v2:find_resource_state(pkg, Resources),
PkgName = element(2, Source),
[update_package(PkgName, RepoConfig, State) || RepoConfig <- RepoConfigs];
_ ->
skip
end
catch
throw:?PRV_ERROR({parse_dep, _}) ->
skip
end.
update_package(Name, RepoConfig, State) ->
case rebar_packages:update_package(Name, RepoConfig, State) of
fail ->
?WARN("Failed to fetch updates for package ~ts from repo ~ts", [Name, maps:get(name, RepoConfig)]);
_ ->
ok
end.

正在加载...
取消
保存