File 0589-sasl-Add-specs-to-all-public-functions.patch of Package erlang
From 196e7cd6a9827eae2b3fa1ada2024733a9736e1c Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Thu, 4 Jan 2024 15:49:41 +0100
Subject: [PATCH 5/6] sasl: Add specs to all public functions
---
lib/sasl/src/alarm_handler.erl | 7 ++
lib/sasl/src/rb.erl | 45 ++++++++++-
lib/sasl/src/release_handler.erl | 126 +++++++++++++++++++++++++++++++
lib/sasl/src/systools.erl | 49 +++++++++++-
4 files changed, 224 insertions(+), 3 deletions(-)
diff --git a/lib/sasl/src/alarm_handler.erl b/lib/sasl/src/alarm_handler.erl
index 77863f0f8f..d197b4e54d 100644
--- a/lib/sasl/src/alarm_handler.erl
+++ b/lib/sasl/src/alarm_handler.erl
@@ -32,6 +32,9 @@
handle_event/2, handle_call/2, handle_info/2,
terminate/2]).
+-type alarm_id() :: term().
+-type alarm() :: {alarm_id(), AlarmDescription :: term()}.
+
start_link() ->
case gen_event:start_link({local, alarm_handler}) of
{ok, Pid} ->
@@ -45,6 +48,8 @@ start_link() ->
%% Args: Alarm ::= {AlarmId, term()}
%% where AlarmId ::= term()
%%-----------------------------------------------------------------
+-spec set_alarm(alarm()) -> term().
+
set_alarm(Alarm) ->
gen_event:notify(alarm_handler, {set_alarm, Alarm}).
@@ -52,6 +57,7 @@ set_alarm(Alarm) ->
%% Func: clear_alarm/1
%% Args: AlarmId ::= term()
%%-----------------------------------------------------------------
+-spec clear_alarm(alarm_id()) -> term().
clear_alarm(AlarmId) ->
gen_event:notify(alarm_handler, {clear_alarm, AlarmId}).
@@ -59,6 +65,7 @@ clear_alarm(AlarmId) ->
%% Func: get_alarms/0
%% Returns: [{AlarmId, AlarmDesc}]
%%-----------------------------------------------------------------
+-spec get_alarms() -> [alarm()].
get_alarms() ->
gen_event:call(alarm_handler, alarm_handler, get_alarms).
diff --git a/lib/sasl/src/rb.erl b/lib/sasl/src/rb.erl
index c8fb4b16a3..bed041d660 100644
--- a/lib/sasl/src/rb.erl
+++ b/lib/sasl/src/rb.erl
@@ -33,6 +33,15 @@
-export([init/1, terminate/2, handle_call/3,
handle_cast/2, handle_info/2, code_change/3]).
+-type type() :: error | error_report | info_msg | info_report |
+ warning_msg | warning_report | crash_report |
+ supervisor_report | progress | all.
+-type option() :: {start_log, FileName :: string() | atom() | pid()} |
+ {max, MaxNoOfReports :: integer() | all} |
+ {report_dir, DirString :: string()} |
+ {type, ReportType :: type() | [type()] | all } |
+ {abort_on_error, boolean()}.
+
%%%-----------------------------------------------------------------
%%% Report Browser Tool.
%%% Formats Error reports written by log_mf_h
@@ -44,7 +53,10 @@
%% Interface functions.
%% For available options; see print_options().
%%-----------------------------------------------------------------
+-spec start() -> term().
start() -> start([]).
+-spec start(Options) -> term() when
+ Options :: [option()].
start(Options) ->
supervisor:start_child(sasl_sup,
{rb_server, {rb, start_link, [Options]},
@@ -53,40 +65,69 @@ start(Options) ->
start_link(Options) ->
gen_server:start_link({local, rb_server}, rb, Options, []).
+-spec stop() -> term().
stop() ->
supervisor:terminate_child(sasl_sup, rb_server).
+-spec rescan() -> term().
rescan() -> rescan([]).
+-spec rescan(Options) -> term() when Options :: [option()].
rescan(Options) ->
call({rescan, Options}).
+-spec list() -> term().
list() -> list(all).
+-spec list(Type :: type()) -> term().
list(Type) -> call({list, Type}).
+-spec log_list() -> term().
log_list() -> log_list(all).
+-spec log_list(Type :: type()) -> term().
log_list(Type) -> call({log_list, Type}).
-show() ->
+-spec show() -> term().
+show() ->
call(show).
-show(Number) when is_integer(Number) ->
+-spec show(Report) -> term() when Report :: integer() | type().
+show(Number) when is_integer(Number) ->
call({show_number, Number});
show(Type) when is_atom(Type) ->
call({show_type, Type}).
+-type regexp() :: string() | {string(), Options :: [re:options()]} |
+ re:mp() | {re:mp(), Options :: [re:compile_options()]}.
+
+-spec grep(RegExp :: regexp()) -> term().
grep(RegExp) -> call({grep, RegExp}).
+-type filter() :: {Key :: term(), Value :: term()} |
+ {Key :: term(), Value :: term(), no} |
+ {Key :: term(), RegExp :: regexp(), re} |
+ {Key :: term(), RegExp :: regexp(), re, no}.
+
+-spec filter(Filters) -> term() when
+ Filters :: [filter()].
filter(Filters) when is_list(Filters) ->
call({filter, Filters}).
+-spec filter(Filters, Dates) -> term() when
+ Filters :: [filter()],
+ Dates :: {DateFrom, DateTo} | {DateFrom, from} | {DateTo, to},
+ DateFrom :: calendar:datetime(),
+ DateTo :: calendar:datetime().
filter(Filters, FDates) when is_list(Filters) andalso is_tuple(FDates) ->
call({filter, {Filters, FDates}}).
+-spec start_log(FileName) -> term() when FileName :: string() | atom() | pid().
start_log(FileName) -> call({start_log, FileName}).
+-spec stop_log() -> term().
stop_log() -> call(stop_log).
+-spec h() -> term().
h() -> help().
+-spec help() -> term().
help() ->
io:format("~nReport Browser Tool - usage~n"),
io:format("===========================~n"),
diff --git a/lib/sasl/src/release_handler.erl b/lib/sasl/src/release_handler.erl
index 7635b1ef78..91e07fec35 100644
--- a/lib/sasl/src/release_handler.erl
+++ b/lib/sasl/src/release_handler.erl
@@ -161,6 +161,9 @@ start_link() ->
%% {file_missing, FileName} | (in the tar package)
%% exit_reason()
%%-----------------------------------------------------------------
+-spec unpack_release(Name) -> {ok, Vsn} | {error, Reason} when Name :: string(),
+ Vsn :: string(),
+ Reason :: client_node | term().
unpack_release(ReleaseName) ->
call({unpack_release, ReleaseName}).
@@ -179,9 +182,19 @@ unpack_release(ReleaseName) ->
%% {no_such_from_vsn, Vsn} |
%% exit_reason()
%%-----------------------------------------------------------------
+-spec check_install_release(Vsn) -> {ok, OtherVsn, Descr} | {error, Reason} when Vsn :: string(),
+ OtherVsn :: string(),
+ Descr :: term(),
+ Reason :: term().
check_install_release(Vsn) ->
check_install_release(Vsn, []).
+-spec check_install_release(Vsn,Opts) -> {ok, OtherVsn, Descr} | {error, Reason} when Vsn :: string(),
+ OtherVsn :: string(),
+ Opts :: [Opt],
+ Opt :: purge,
+ Descr :: term(),
+ Reason :: term().
check_install_release(Vsn, Opts) ->
case check_check_install_options(Opts, false) of
{ok,Purge} ->
@@ -213,10 +226,35 @@ check_check_install_options([],Purge) ->
%% {illegal_option, Opt}} |
%% exit_reason()
%%-----------------------------------------------------------------
+-spec install_release(Vsn) -> {ok, OtherVsn, Descr} | {error, Reason} when
+ Vsn :: string(),
+ OtherVsn :: string(),
+ Descr :: term(),
+ Reason :: {already_installed, Vsn} |
+ {change_appl_data, term()} |
+ {missing_base_app, OtherVsn, App} |
+ {could_not_create_hybrid_boot, term()} |
+ term(),
+ App :: atom().
install_release(Vsn) ->
call({install_release, Vsn, restart, []}).
+-spec install_release(Vsn, [Opt]) -> {ok, OtherVsn, Descr} | {continue_after_restart, OtherVsn, Descr} | {error, Reason} when
+ Vsn :: string(),
+ OtherVsn :: string(),
+ Opt :: {error_action, Action} | {code_change_timeout, Timeout} | {suspend_timeout, Timeout} | {update_paths, Bool},
+ Action :: restart | reboot,
+ Timeout :: default | infinity | pos_integer(),
+ Bool :: boolean(),
+ Descr :: term(),
+ Reason :: {illegal_option, Opt} |
+ {already_installed, Vsn} |
+ {change_appl_data, term()} |
+ {missing_base_app, OtherVsn, App} |
+ {could_not_create_hybrid_boot, term()} |
+ term(),
+ App :: atom().
install_release(Vsn, Opt) ->
case check_install_options(Opt, restart, []) of
{ok, ErrorAction, InstallOpt} ->
@@ -275,12 +313,23 @@ new_emulator_upgrade(Vsn, Opts) ->
%% {no_such_release, Vsn} |
%% exit_reason()
%%-----------------------------------------------------------------
+-spec make_permanent(Vsn) -> ok | {error, Reason}
+ when
+ Vsn :: string(),
+ Reason ::
+ {bad_status, Status :: term()} | term().
make_permanent(Vsn) ->
call({make_permanent, Vsn}).
%%-----------------------------------------------------------------
%% Purpose: Reboots the system from an old release.
%%-----------------------------------------------------------------
+-spec reboot_old_release(Vsn) -> ok | {error, Reason}
+ when
+ Vsn :: string(),
+ Reason ::
+ {bad_status, Status :: term()} |
+ term().
reboot_old_release(Vsn) ->
call({reboot_old_release, Vsn}).
@@ -291,6 +340,8 @@ reboot_old_release(Vsn) ->
%% Returns: ok | {error, Reason}
%% Reason = {permanent, Vsn} |
%%-----------------------------------------------------------------
+-spec remove_release(Vsn) -> ok | {error, Reason} when Vsn :: string(),
+ Reason :: {permanent, Vsn} | client_node | term().
remove_release(Vsn) ->
call({remove_release, Vsn}).
@@ -310,6 +361,12 @@ remove_release(Vsn) ->
%% them).
%% Returns: ok | {error, Reason}
%%-----------------------------------------------------------------
+-spec set_unpacked(RelFile, AppDirs) -> {ok, Vsn} | {error, Reason} when RelFile :: string(),
+ AppDirs :: [{App, Vsn, Dir}],
+ App :: atom(),
+ Vsn :: string(),
+ Dir :: string(),
+ Reason :: term().
set_unpacked(RelFile, LibDirs) ->
call({set_unpacked, RelFile, LibDirs}).
@@ -320,6 +377,8 @@ set_unpacked(RelFile, LibDirs) ->
%% This function won't delete any files at all.
%% Returns: ok | {error, Reason}
%%-----------------------------------------------------------------
+-spec set_removed(Vsn) -> ok | {error, Reason} when Vsn :: string(),
+ Reason :: {permanent, Vsn} | term().
set_removed(Vsn) ->
call({set_removed, Vsn}).
@@ -331,6 +390,9 @@ set_removed(Vsn) ->
%% is called.
%% Returns: ok | {error, {no_such_release, Vsn}}
%%-----------------------------------------------------------------
+-spec install_file(Vsn, File) -> ok | {error, Reason} when Vsn :: string(),
+ File :: string(),
+ Reason :: term().
install_file(Vsn, File) when is_list(File) ->
call({install_file, File, Vsn}).
@@ -338,6 +400,10 @@ install_file(Vsn, File) when is_list(File) ->
%% Returns: [{Name, Vsn, [LibName], Status}]
%% Status = unpacked | current | permanent | old
%%-----------------------------------------------------------------
+-spec which_releases() -> [{Name, Vsn, Apps, Status}] when Name :: string(),
+ Vsn :: string(),
+ Apps :: [AppVsn :: string()],
+ Status :: unpacked | current | permanent | old.
which_releases() ->
call(which_releases).
@@ -345,6 +411,10 @@ which_releases() ->
%% Returns: [{Name, Vsn, [LibName], Status}]
%% Status = unpacked | current | permanent | old
%%-----------------------------------------------------------------
+-spec which_releases(Status) -> [{Name, Vsn, Apps, Status}] when Name :: string(),
+ Vsn :: string(),
+ Apps :: [AppVsn :: string()],
+ Status :: unpacked | current | permanent | old.
which_releases(Status) ->
Releases = which_releases(),
get_releases_with_status(Releases, Status, []).
@@ -384,8 +454,24 @@ create_RELEASES([Root, RelFile | LibDirs]) ->
create_RELEASES(Root, RelFile) ->
create_RELEASES(Root, filename:join(Root, "releases"), RelFile, []).
+-spec create_RELEASES(RelDir, RelFile, AppDirs) -> ok | {error, Reason} when
+ RelDir :: string(),
+ RelFile :: string(),
+ AppDirs :: [{App, Vsn, Dir}],
+ App :: atom(),
+ Vsn :: string(),
+ Dir :: string(),
+ Reason :: term().
create_RELEASES(RelDir, RelFile, LibDirs) ->
create_RELEASES("", RelDir, RelFile, LibDirs).
+-spec create_RELEASES(Root, RelDir, RelFile, AppDirs) -> ok | {error, Reason} when Root :: string(),
+ RelDir :: string(),
+ RelFile :: string(),
+ AppDirs :: [{App, Vsn, Dir}],
+ App :: atom(),
+ Vsn :: string(),
+ Dir :: string(),
+ Reason :: term().
create_RELEASES(Root, RelDir, RelFile, LibDirs) ->
case catch check_rel(Root, RelFile, LibDirs, false) of
{error, Reason } ->
@@ -405,6 +491,11 @@ create_RELEASES(Root, RelDir, RelFile, LibDirs) ->
%% located under Dir/ebin
%% Purpose: Upgrade to the version in Dir according to an appup file
%%-----------------------------------------------------------------
+-spec upgrade_app(App, Dir) -> {ok, Unpurged} | restart_emulator | {error, Reason} when App :: atom(),
+ Dir :: string(),
+ Unpurged :: [Module],
+ Module :: atom(),
+ Reason :: term().
upgrade_app(App, NewDir1) ->
NewDir = root_dir_relative_path(NewDir1),
try upgrade_script(App, NewDir) of
@@ -428,6 +519,12 @@ upgrade_app(App, NewDir1) ->
%% Purpose: Downgrade from the version in Dir according to an appup file
%% located in the ebin dir of the _current_ version
%%-----------------------------------------------------------------
+-spec downgrade_app(App, Dir) -> {ok, Unpurged} | restart_emulator | {error, Reason} when
+ App :: atom(),
+ Dir :: string(),
+ Unpurged :: [Module],
+ Module :: atom(),
+ Reason :: term().
downgrade_app(App, OldDir) ->
case string:lexemes(filename:basename(OldDir), "-") of
[_AppS, OldVsn] ->
@@ -435,6 +532,12 @@ downgrade_app(App, OldDir) ->
_ ->
{error, {unknown_version, App}}
end.
+-spec downgrade_app(App, OldVsn, Dir) -> {ok, Unpurged} | restart_emulator | {error, Reason} when App :: atom(),
+ Dir :: string(),
+ OldVsn :: string(),
+ Unpurged :: [Module],
+ Module :: atom(),
+ Reason :: term().
downgrade_app(App, OldVsn, OldDir) ->
try downgrade_script(App, OldVsn, OldDir) of
{ok, Script} ->
@@ -444,6 +547,12 @@ downgrade_app(App, OldVsn, OldDir) ->
{error, Reason}
end.
+-spec upgrade_script(App, Dir) -> {ok, NewVsn, Script}
+ when
+ App :: atom(),
+ Dir :: string(),
+ NewVsn :: string(),
+ Script :: Instructions :: term().
upgrade_script(App, NewDir1) ->
NewDir = root_dir_relative_path(NewDir1),
OldVsn = ensure_running(App),
@@ -459,6 +568,12 @@ upgrade_script(App, NewDir1) ->
throw(Reason)
end.
+-spec downgrade_script(App, OldVsn, Dir) -> {ok, Script}
+ when
+ App :: atom(),
+ OldVsn :: string(),
+ Dir :: string(),
+ Script :: Instructions :: term().
downgrade_script(App, OldVsn, OldDir) ->
NewVsn = ensure_running(App),
NewDir = code:lib_dir(App),
@@ -473,6 +588,17 @@ downgrade_script(App, OldVsn, OldDir) ->
throw(Reason)
end.
+-spec eval_appup_script(App, ToVsn, ToDir, Script :: term()) ->
+ {ok, Unpurged} |
+ restart_emulator |
+ {error, Reason}
+ when
+ App :: atom(),
+ ToVsn :: string(),
+ ToDir :: string(),
+ Unpurged :: [Module],
+ Module :: atom(),
+ Reason :: term().
eval_appup_script(App, ToVsn, ToDir, Script) ->
EnvBefore = application_controller:prep_config_change(),
AppSpecL = read_appspec(App, ToDir),
diff --git a/lib/sasl/src/systools.erl b/lib/sasl/src/systools.erl
index 889cf924a3..2fe7264832 100644
--- a/lib/sasl/src/systools.erl
+++ b/lib/sasl/src/systools.erl
@@ -47,10 +47,29 @@
%% local generates a script with references to the directories there
%% the applications are found.
%%-----------------------------------------------------------------
+-spec make_script(Name) -> Result when
+ Name :: string(),
+ Result :: ok | error | {ok,Module,Warnings} | {error,Module,Error},
+ Module :: atom(),
+ Warnings :: term(),
+ Error :: term().
make_script([RelName|Opts]) when is_atom(RelName) ->
- make_script([RelName], Opts);
+ systools_make:make_script([RelName], Opts);
make_script(RelName) -> make_script(RelName, []).
+-spec make_script(Name, [Opt]) -> Result when
+ Name :: string(),
+ Opt :: src_tests | {path,[Dir]} | local | {variables,[Var]} | exref | {exref,[App]} |
+ silent | {outdir,Dir} | no_dot_erlang | no_warn_sasl | warnings_as_errors | {script_name, Name},
+ Dir :: string(),
+ Var :: {VarName,Prefix},
+ VarName :: string(),
+ Prefix :: string(),
+ App :: atom(),
+ Result :: ok | error | {ok,Module,Warnings} | {error,Module,Error},
+ Module :: atom(),
+ Warnings :: term(),
+ Error :: term().
make_script(RelName, Opt) ->
systools_make:make_script(RelName, Opt).
@@ -94,6 +113,7 @@ make_tar(RelName, Opt) ->
%%-----------------------------------------------------------------
%% Create a binary form of a boot script.
%%-----------------------------------------------------------------
+-spec script2boot(File) -> ok | error when File :: string().
script2boot(File) ->
case systools_lib:file_term2binary(File ++ ".script", File ++ ".boot") of
{error,Error} ->
@@ -119,8 +139,35 @@ script2boot(File, Output0, _Opt) ->
%% search path, silent suppresses error message printing on console,
%% noexec suppresses writing the output "relup" file
%%-----------------------------------------------------------------
+-spec make_relup(Name, UpFrom, DownTo) -> Result when Name :: string(),
+ UpFrom :: [Name | {Name,Descr}],
+ DownTo :: [Name | {Name,Descr}],
+ Descr :: term(),
+ Result :: ok | error | {ok,Relup :: term(),Module,Warnings} | {error,Module,Error},
+ Module :: atom(),
+ Warnings :: term(),
+ Error :: term().
make_relup(ReleaseName, UpNameList, DownNameList) ->
systools_relup:mk_relup(ReleaseName, UpNameList, DownNameList, []).
+-spec make_relup(Name, UpFrom, DownTo, [Opt]) -> Result
+ when
+ Name :: string(),
+ UpFrom :: [Name | {Name, Descr}],
+ DownTo :: [Name | {Name, Descr}],
+ Descr :: term(),
+ Opt ::
+ {path, [Dir]} |
+ restart_emulator | silent | noexec |
+ {outdir, Dir} |
+ warnings_as_errors,
+ Dir :: string(),
+ Result ::
+ ok | error |
+ {ok, Relup :: term(), Module, Warnings} |
+ {error, Module, Error},
+ Module :: atom(),
+ Warnings :: term(),
+ Error :: term().
make_relup(ReleaseName, UpNameList, DownNameList, Opts) ->
systools_relup:mk_relup(ReleaseName, UpNameList, DownNameList, Opts).
--
2.35.3