Skip to content

Commit

Permalink
Merge branch 'maint'
Browse files Browse the repository at this point in the history
* maint:
  Check that sys.config and relup have valid content when added to tar
  Reject systools:make_script if kernel and stdlib are not permanent in .rel
  Don't save child spec for temporary child if child's start func returns ignore
  Generate links in C libraries correctly
  • Loading branch information
uabboli committed Dec 22, 2011
2 parents 919565a + c274375 commit f8afba0
Show file tree
Hide file tree
Showing 7 changed files with 302 additions and 73 deletions.
62 changes: 36 additions & 26 deletions lib/erl_docgen/priv/xsl/db_html.xsl
Original file line number Diff line number Diff line change
Expand Up @@ -1854,18 +1854,24 @@

<xsl:choose>
<xsl:when test="string-length($filepart) > 0">
<xsl:variable name="modulepart"><xsl:value-of select="substring-before($filepart, ':')"/></xsl:variable>
<!-- "Filepart#Linkpart" (or "Filepart#") -->
<xsl:variable name="app_part"><xsl:value-of select="substring-before($filepart, ':')"/></xsl:variable>
<xsl:choose>
<xsl:when test="string-length($modulepart) > 0">
<xsl:variable name="filepart1"><xsl:value-of select="substring-after($filepart, ':')"/></xsl:variable>
<span class="bold_code"><a href="javascript:erlhref('{$topdocdir}/../','{$modulepart}','{$filepart1}.html#{$linkpart}');"><xsl:apply-templates/></a></span>
<xsl:when test="string-length($app_part) > 0">
<!-- "AppPart:ModPart#Linkpart" -->
<xsl:variable name="mod_part"><xsl:value-of select="substring-after($filepart, ':')"/></xsl:variable>
<span class="bold_code"><a href="javascript:erlhref('{$topdocdir}/../','{$app_part}','{$mod_part}.html#{$linkpart}');"><xsl:apply-templates/></a></span>
</xsl:when>
<xsl:otherwise>
<!-- "Filepart#Linkpart (there is no ':' in Filepart) -->
<xsl:variable name="minus_prefix"
select="substring-before($linkpart, '-')"/>
<xsl:choose>
<!-- Dialyzer seealso (the application is unknown) -->
<xsl:when test="string-length($specs_file) > 0
<xsl:when test="$minus_prefix = 'type'
and string-length($specs_file) > 0
and count($i/specs/module[@name=$filepart]) = 0">
<!-- Deemed to slow; use key() instead
<!-- Dialyzer seealso (the application is unknown) -->
<!-- Following code deemed too slow; use key() instead
<xsl:variable name="app"
select="$m2a/mod2app/module[@name=$filepart]"/>
-->
Expand All @@ -1877,41 +1883,45 @@
<span class="bold_code"><a href="javascript:erlhref('{$topdocdir}/../','{$app}','{$filepart}.html#{$linkpart}');"><xsl:value-of select="$this"/></a></span>
</xsl:when>
<xsl:otherwise>
<!-- Unknown application; no link -->
<xsl:value-of select="$this"/>
<!-- Unknown application -->
<xsl:message terminate="yes">
Error <xsl:value-of select="$filepart"/>: cannot find module exporting type
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:when>
<xsl:when test="string-length($linkpart) > 0">
<!-- Still Filepart#Linkpart (there is no ':' in Filepart -->
<span class="bold_code"><a href="{$filepart}.html#{$linkpart}"><xsl:apply-templates/></a></span>
</xsl:when>
<xsl:otherwise>
<!-- "Filepart#" (there is no ':' in Filepart -->
<span class="bold_code"><a href="{$filepart}.html"><xsl:apply-templates/></a></span>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:when> <!-- string-length($filepart) > 0 -->
<xsl:when test="string-length($linkpart) > 0">
<!-- "#Linkpart" -->
<span class="bold_code"><a href="#{$linkpart}"><xsl:apply-templates/></a></span>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="string-length($linkpart) > 0">
<span class="bold_code"><a href="#{$linkpart}"><xsl:apply-templates/></a></span>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="modulepart"><xsl:value-of select="substring-before(@marker, ':')"/></xsl:variable>
<!-- "AppPart:Mod" or "Mod" (there is no '#') -->
<xsl:variable name="app_part"><xsl:value-of select="substring-before(@marker, ':')"/></xsl:variable>

<xsl:choose>
<xsl:when test="string-length($modulepart) > 0">
<xsl:variable name="filepart1"><xsl:value-of select="substring-after(@marker, ':')"/></xsl:variable>
<span class="bold_code"><a href="javascript:erlhref('{$topdocdir}/../','{$modulepart}','{$filepart1}.html');"><xsl:apply-templates/></a></span>
</xsl:when>
<xsl:otherwise>
<span class="bold_code"><a href="{@marker}.html"><xsl:apply-templates/></a></span>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="string-length($app_part) > 0">
<!-- "App:Mod" -->
<xsl:variable name="mod_part"><xsl:value-of select="substring-after(@marker, ':')"/></xsl:variable>
<span class="bold_code"><a href="javascript:erlhref('{$topdocdir}/../','{$app_part}','{$mod_part}.html');"><xsl:apply-templates/></a></span>
</xsl:when>
<xsl:otherwise>
<!-- "Mod" -->
<span class="bold_code"><a href="{@marker}.html"><xsl:apply-templates/></a></span>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>

Expand Down
4 changes: 4 additions & 0 deletions lib/sasl/doc/src/systools.xml
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,10 @@
<p>The applications are sorted according to the dependencies
between the applications. Where there are no dependencies,
the order in the <c>.rel</c> file is kept.</p>
<p>The function will fail if the mandatory
applications <c>kernel</c> and <c>stdlib</c> are not
included in the <c>.rel</c> file and have start
type <c>permanent</c> (default).</p>
<p>If <c>sasl</c> is not included as an application in
the <c>.rel</c> file, a warning is emitted because such a
release can not be used in an upgrade. To turn off this
Expand Down
94 changes: 71 additions & 23 deletions lib/sasl/src/systools_make.erl
Original file line number Diff line number Diff line change
Expand Up @@ -463,30 +463,35 @@ check_appl(Appl) ->
end,
Appl) of
[] ->
{ok,Ws} = mandatory_applications(Appl),
{split_app_incl(Appl),Ws};
{ApplsNoIncls,Incls} = split_app_incl(Appl),
{ok,Ws} = mandatory_applications(ApplsNoIncls,undefined,
undefined,undefined),
{{ApplsNoIncls,Incls},Ws};
Illegal ->
throw({error, {illegal_applications,Illegal}})
end.

mandatory_applications(Appl) ->
AppNames = map(fun(AppT) -> element(1, AppT) end,
Appl),
Mand = mandatory_applications(),
case filter(fun(X) -> member(X, AppNames) end, Mand) of
Mand ->
case member(sasl,AppNames) of
true ->
{ok,[]};
_ ->
{ok, [{warning,missing_sasl}]}
end;
_ ->
throw({error, {missing_mandatory_app, Mand}})
end.

mandatory_applications() ->
[kernel, stdlib].
mandatory_applications([{kernel,_,Type}|Apps],undefined,Stdlib,Sasl) ->
mandatory_applications(Apps,Type,Stdlib,Sasl);
mandatory_applications([{stdlib,_,Type}|Apps],Kernel,undefined,Sasl) ->
mandatory_applications(Apps,Kernel,Type,Sasl);
mandatory_applications([{sasl,_,Type}|Apps],Kernel,Stdlib,undefined) ->
mandatory_applications(Apps,Kernel,Stdlib,Type);
mandatory_applications([_|Apps],Kernel,Stdlib,Sasl) ->
mandatory_applications(Apps,Kernel,Stdlib,Sasl);
mandatory_applications([],Type,_,_) when Type=/=permanent ->
error_mandatory_application(kernel,Type);
mandatory_applications([],_,Type,_) when Type=/=permanent ->
error_mandatory_application(sasl,Type);
mandatory_applications([],_,_,undefined) ->
{ok, [{warning,missing_sasl}]};
mandatory_applications([],_,_,_) ->
{ok,[]}.

error_mandatory_application(App,undefined) ->
throw({error, {missing_mandatory_app, App}});
error_mandatory_application(App,Type) ->
throw({error, {mandatory_app, App, Type}}).

split_app_incl(Appl) -> split_app_incl(Appl, [], []).

Expand Down Expand Up @@ -1677,13 +1682,15 @@ add_system_files(Tar, RelName, Release, Path1) ->
false ->
ignore;
Relup ->
check_relup(Relup),
add_to_tar(Tar, Relup, filename:join(RelVsnDir, "relup"))
end,

case lookup_file("sys.config", Path) of
false ->
ignore;
Sys ->
check_sys_config(Sys),
add_to_tar(Tar, Sys, filename:join(RelVsnDir, "sys.config"))
end,

Expand All @@ -1700,6 +1707,44 @@ lookup_file(Name, [Dir|Path]) ->
lookup_file(_Name, []) ->
false.

%% Check that relup can be parsed and has expected format
check_relup(File) ->
case file:consult(File) of
{ok,[{Vsn,UpFrom,DownTo}]} when is_list(Vsn), is_integer(hd(Vsn)),
is_list(UpFrom), is_list(DownTo) ->
ok;
{ok,_} ->
throw({error,{tar_error,{add,"relup",[invalid_format]}}});
Other ->
throw({error,{tar_error,{add,"relup",[Other]}}})
end.

%% Check that sys.config can be parsed and has expected format
check_sys_config(File) ->
case file:consult(File) of
{ok,[SysConfig]} ->
case lists:all(fun({App,KeyVals}) when is_atom(App),
is_list(KeyVals)->
true;
(OtherConfig) when is_list(OtherConfig),
is_integer(hd(OtherConfig)) ->
true;
(_) ->
false
end,
SysConfig) of
true ->
ok;
false ->
throw({error,{tar_error,
{add,"sys.config",[invalid_format]}}})
end;
{ok,_} ->
throw({error,{tar_error,{add,"sys.config",[invalid_format]}}});
Other ->
throw({error,{tar_error,{add,"sys.config",[Other]}}})
end.

%%______________________________________________________________________
%% Add either a application located under a variable dir or all other
%% applications to a tar file.
Expand Down Expand Up @@ -2187,9 +2232,12 @@ format_error({missing_parameter,Par}) ->
format_error({illegal_applications,Names}) ->
io_lib:format("Illegal applications in the release file: ~p~n",
[Names]);
format_error({missing_mandatory_app,Names}) ->
io_lib:format("Mandatory applications (~p) must be specified in the release file~n",
[Names]);
format_error({missing_mandatory_app,Name}) ->
io_lib:format("Mandatory application ~p must be specified in the release file~n",
[Name]);
format_error({mandatory_app,Name,Type}) ->
io_lib:format("Mandatory application ~p must be of type 'permanent' in the release file. Is '~p'.~n",
[Name,Type]);
format_error({duplicate_register,Dups}) ->
io_lib:format("Duplicated register names: ~n~s",
[map(fun({{Reg,App1,_,_},{Reg,App2,_,_}}) ->
Expand Down
Loading

0 comments on commit f8afba0

Please sign in to comment.