Disregard this patch.
On Sun, Nov 23, 2008 at 9:07 PM, Eric Merritt <[EMAIL PROTECTED]> wrote:
> ---
> _build.cfg | 2 +-
> lib/ewlib/ebin/ewlib.app | 18 +-
> lib/ewlib/src/ewl_file.erl | 110 +++++++----
> lib/ewrepo/src/ewr_depends.erl | 46 +++---
> lib/ewrepo/src/ewr_resolver.erl | 395
> +++++++++++++++++++++++----------------
> 5 files changed, 335 insertions(+), 236 deletions(-)
>
> diff --git a/_build.cfg b/_build.cfg
> index 7aad23e..5c1dace 100644
> --- a/_build.cfg
> +++ b/_build.cfg
> @@ -1,6 +1,6 @@
> project : {
> name : erlware
> - vsn : "0.5.0.0"
> + vsn : "0.6.0.0"
> },
>
> repositories : ["http://repo.erlware.org/pub"],
> diff --git a/lib/ewlib/ebin/ewlib.app b/lib/ewlib/ebin/ewlib.app
> index 6f8e572..3653c32 100644
> --- a/lib/ewlib/ebin/ewlib.app
> +++ b/lib/ewlib/ebin/ewlib.app
> @@ -1,15 +1,15 @@
> {application, ewlib,
> [{description, "Erlware support library"},
> - {vsn, "0.8.2.0"},
> + {vsn, "0.9.2.0"},
> {modules, [
> - ewl_talk,
> - ewl_elwrap_h,
> - ewl_get_opt,
> - ewl_string_manip,
> - ewl_file,
> - ewl_config_diff,
> - ewl_installed_paths,
> - ewl_package_paths,
> + ewl_talk,
> + ewl_elwrap_h,
> + ewl_get_opt,
> + ewl_string_manip,
> + ewl_file,
> + ewl_config_diff,
> + ewl_installed_paths,
> + ewl_package_paths,
> ewl_sinan_paths
> ]},
> {registered, []},
> diff --git a/lib/ewlib/src/ewl_file.erl b/lib/ewlib/src/ewl_file.erl
> index b328281..1e069dc 100644
> --- a/lib/ewlib/src/ewl_file.erl
> +++ b/lib/ewlib/src/ewl_file.erl
> @@ -1,31 +1,32 @@
> +
> %%%-------------------------------------------------------------------
> %%% Copyright (c) 2006 Erlware
> %%%
> -%%% Permission is hereby granted, free of charge, to any
> -%%% person obtaining a copy of this software and associated
> -%%% documentation files (the "Software"), to deal in the
> -%%% Software without restriction, including without limitation
> +%%% Permission is hereby granted, free of charge, to any
> +%%% person obtaining a copy of this software and associated
> +%%% documentation files (the "Software"), to deal in the
> +%%% Software without restriction, including without limitation
> %%% the rights to use, copy, modify, merge, publish, distribute,
> -%%% sublicense, and/or sell copies of the Software, and to permit
> -%%% persons to whom the Software is furnished to do so, subject to
> +%%% sublicense, and/or sell copies of the Software, and to permit
> +%%% persons to whom the Software is furnished to do so, subject to
> %%% the following conditions:
> %%%
> -%%% The above copyright notice and this permission notice shall
> +%%% The above copyright notice and this permission notice shall
> %%% be included in all copies or substantial portions of the Software.
> %%%
> %%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> -%%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
> -%%% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> -%%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
> +%%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
> +%%% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> +%%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
> %%% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
> %%% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> -%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> +%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> %%% OTHER DEALINGS IN THE SOFTWARE.
> %%%-------------------------------------------------------------------
> -%%% @author Martin J. Logan
> +%%% @author Martin J. Logan
> %%%
> %%% @doc
> -%%% Functions to aid in common file system operations that are not supplied
> in the erlang stdlib.
> +%%% Functions to aid in common file system operations that are not supplied
> in the erlang stdlib.
> %%% @end
> %%%-------------------------------------------------------------------
> -module(ewl_file).
> @@ -43,7 +44,9 @@
> compress/2,
> uncompress/1,
> uncompress/2,
> - gsub_file/3
> + gsub_file/3,
> + file_exists/1,
> + list_subdirectories/1
> ]).
>
> %%--------------------------------------------------------------------
> @@ -56,15 +59,44 @@
> %% External functions
> %%====================================================================
> %%--------------------------------------------------------------------
> +%% @doc
> +%% Get the list of subdirectories for the current directory
> +%%
> +%% @spec (Dir) -> ListOfDirs
> +%% @end
> +%%--------------------------------------------------------------------
> +list_subdirectories(Dir) ->
> + lists:filter(fun(X) -> filelib:is_dir(X) end,
> + filelib:wildcard(Dir ++ "/*")).
> +
> +%%-------------------------------------------------------------------
> +%% @doc
> +%% Check to see if a file exists.
> +%%
> +%% @spec (FileName) -> true | false
> +%% @end
> +%%-------------------------------------------------------------------
> +file_exists(FileName) ->
> + case file:read_file_info(FileName) of
> + {error, enoent} ->
> + false;
> + Error = {error, _} ->
> + throw(Error);
> + _ ->
> + true
> + end.
> +
> +
> +%%--------------------------------------------------------------------
> %% @doc delete a non empty directory.
> -%% @spec delete_dir(Path) -> ok
> +%% @spec delete_dir(Path) -> ok
> %% @end
> %%--------------------------------------------------------------------
> delete_dir(Path) ->
> case filelib:is_dir(Path) of
> false ->
> case filelib:is_file(Path) of
> - false ->
> + false ->
> case file:read_link_info(Path) of
> {ok, LinkInfo} ->
> %% XXX Exploiting the structure of a record, tisk,
> tisk, should probably include the proper .hrl file.
> @@ -73,7 +105,7 @@ delete_dir(Path) ->
> _ ->
> error_logger:info_msg("delete_dir/1 file does not
> exist ~p~n", [Path]), ok
> end;
> - true ->
> + true ->
> ok = file:delete(Path)
> end;
> true ->
> @@ -95,7 +127,7 @@ copy_dir(From, To) ->
> true -> ok;
> false -> ok = file:make_dir(To)
> end,
> - lists:foreach(fun(ChildFrom) ->
> + lists:foreach(fun(ChildFrom) ->
> copy_dir(ChildFrom, lists:flatten([To, "/",
> filename:basename(ChildFrom)]))
> end, filelib:wildcard(From ++ "/*"))
> end.
> @@ -121,11 +153,11 @@ create_tmp_dir(Prefix) ->
> ok -> {ok, TmpDirPath};
> Error -> Error
> end.
> -
> +
>
> %%-------------------------------------------------------------------
> %% @doc
> -%% Makes a directory including parent dirs if they are missing.
> +%% Makes a directory including parent dirs if they are missing.
> %% @spec mkdir_p(Path) -> ok | exit()
> %% @end
> %%-------------------------------------------------------------------
> @@ -134,7 +166,7 @@ mkdir_p(Path) ->
> "win32" ->
> filelib:ensure_dir(lists:flatten([filename:absname(Path), "\\"]));
> _SysArch ->
> - filelib:ensure_dir(lists:flatten([filename:absname(Path), "/"]))
> + filelib:ensure_dir(lists:flatten([filename:absname(Path), "/"]))
> end.
>
> %%-------------------------------------------------------------------
> @@ -143,7 +175,7 @@ mkdir_p(Path) ->
> %% are very straight forward. Indicate where you want the tar file
> %% to be placed and indicate what file you want to tar up. This will
> %% do that. It will tar the target file as if it was doing it from
> -%% directory that contains it.
> +%% directory that contains it.
> %% <pre>
> %% Variables:
> %% TarFilePath - The name or path to the file to be produced as a result of
> the tar command.
> @@ -157,7 +189,7 @@ mkdir_p(Path) ->
> %% @end
> %%-------------------------------------------------------------------
> compress(TarFilePath, TargetFilePath) ->
> - %% Wrapping this just in case we have to go back to os specific code - I
> am tired of changing this all over the place :)
> + %% Wrapping this just in case we have to go back to os specific code - I
> am tired of changing this all over the place :)
> TarFileName = filename:basename(TarFilePath),
> TargetFileName = filename:basename(TargetFilePath),
>
> @@ -166,9 +198,9 @@ compress(TarFilePath, TargetFilePath) ->
> file:rename(TarFileName, TarFilePath)
> end,
> run_in_location(Fun, filename:dirname(TargetFilePath)).
> -
> +
> %%-------------------------------------------------------------------
> -%% @doc Uncompress a file or directory using the native os compression
> system. For linux/unix it is tar.
> +%% @doc Uncompress a file or directory using the native os compression
> system. For linux/unix it is tar.
> %% <pre>
> %% Variables:
> %% TarFileName - The path and name of the tar file to be untarred.
> @@ -178,7 +210,7 @@ compress(TarFilePath, TargetFilePath) ->
> %% @end
> %%-------------------------------------------------------------------
> uncompress(TarFilePath, TargetDirPath) ->
> - %% Wrapping this just in case we have to go back to os specific code - I
> am tired of changing this all over the place :)
> + %% Wrapping this just in case we have to go back to os specific code - I
> am tired of changing this all over the place :)
> TarFileName = filename:basename(TarFilePath),
> RelocatedTarFilePath = filename:join(TargetDirPath, TarFileName),
> case TarFilePath == RelocatedTarFilePath of
> @@ -194,15 +226,15 @@ uncompress(TarFilePath, TargetDirPath) ->
> end
> end,
> run_in_location(Fun, TargetDirPath).
> -
> -
> +
> +
> %% @spec uncompress(TarFilePath::string()) -> ok | exit()
> -%% @equiv uncompress(TarFilePath, CurrentWorkingDirectory)
> +%% @equiv uncompress(TarFilePath, CurrentWorkingDirectory)
> uncompress(TarFilePath) ->
> {ok, CWD} = file:get_cwd(),
> uncompress(TarFilePath, CWD).
> -
> -
> +
> +
> %%-------------------------------------------------------------------
> %% @doc
> %% Finds files and directories that match the regexp supplied in the
> TargetPattern regexp.
> @@ -215,18 +247,18 @@ find([], _) ->
> find(FromDir, TargetPattern) ->
> case filelib:is_dir(FromDir) of
> false ->
> - case regexp:match(FromDir, TargetPattern) of
> - {match, _, _} -> [FromDir];
> + case regexp:match(FromDir, TargetPattern) of
> + {match, _, _} -> [FromDir];
> _ -> []
> end;
> true ->
> - FoundDir = case regexp:match(FromDir, TargetPattern) of
> - {match, _, _} -> [FromDir];
> + FoundDir = case regexp:match(FromDir, TargetPattern) of
> + {match, _, _} -> [FromDir];
> _ -> []
> end,
> - List = lists:foldl(fun(CheckFromDir, Acc) when CheckFromDir ==
> FromDir ->
> + List = lists:foldl(fun(CheckFromDir, Acc) when CheckFromDir ==
> FromDir ->
> Acc;
> - (ChildFromDir, Acc) ->
> + (ChildFromDir, Acc) ->
> case find(ChildFromDir, TargetPattern) of
> [] -> Acc;
> Res -> Res ++ Acc
> @@ -258,7 +290,7 @@ gsub_file(FilePath, RegExp, New) ->
> {ok, BinaryContents} =file:read_file(FilePath),
> Contents = binary_to_list(BinaryContents),
> case regexp:gsub(Contents, RegExp, New) of
> - {ok, NewContents, RepCount} ->
> + {ok, NewContents, RepCount} ->
> {ok, IOD} = file:open(FilePath, [write]),
> ok = io:fwrite(IOD, "~s", [NewContents]),
> {ok, RepCount};
> @@ -278,7 +310,7 @@ gsub_file(FilePath, RegExp, New) ->
> %%--------------------------------------------------------------------
> ensure_leading_slash(String) ->
> lists:flatten(["/", string:strip(String, left, $/)]).
> -
> +
> %%--------------------------------------------------------------------
> %% @private
> %% @doc ensure that the string provided does not contain a trailing slash
> diff --git a/lib/ewrepo/src/ewr_depends.erl b/lib/ewrepo/src/ewr_depends.erl
> index 8d0cb2d..d95f406 100644
> --- a/lib/ewrepo/src/ewr_depends.erl
> +++ b/lib/ewrepo/src/ewr_depends.erl
> @@ -1,31 +1,31 @@
> %%%-------------------------------------------------------------------
> %%% Copyright (c) 2006 Eric Merritt, Martin Logan
> %%%
> -%%% Permission is hereby granted, free of charge, to any
> -%%% person obtaining a copy of this software and associated
> -%%% documentation files (the "Software"), to deal in the
> -%%% Software without restriction, including without limitation
> +%%% Permission is hereby granted, free of charge, to any
> +%%% person obtaining a copy of this software and associated
> +%%% documentation files (the "Software"), to deal in the
> +%%% Software without restriction, including without limitation
> %%% the rights to use, copy, modify, merge, publish, distribute,
> -%%% sublicense, and/or sell copies of the Software, and to permit
> -%%% persons to whom the Software is furnished to do so, subject to
> +%%% sublicense, and/or sell copies of the Software, and to permit
> +%%% persons to whom the Software is furnished to do so, subject to
> %%% the following conditions:
> %%%
> -%%% The above copyright notice and this permission notice shall
> +%%% The above copyright notice and this permission notice shall
> %%% be included in all copies or substantial portions of the Software.
> %%%
> %%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> -%%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
> -%%% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> -%%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
> +%%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
> +%%% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> +%%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
> %%% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
> %%% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> -%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> +%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> %%% OTHER DEALINGS IN THE SOFTWARE.
> %%%-------------------------------------------------------------------
> %%% @author Eric Merritt
> %%% @copyright 2006 Erlware
> %%% @doc
> -%%% Figures out the dependencies for the application, via teh
> +%%% Figures out the dependencies for the application, via teh
> %%% ewr_deps_engine.
> %%% @end
> %%%-------------------------------------------------------------------
> @@ -43,21 +43,21 @@
> %% API
> %%====================================================================
> %%--------------------------------------------------------------------
> -%% @doc
> -%% Resolves dependencies using the information provided by Urls.
> -%%
> +%% @doc
> +%% Resolves dependencies using the information provided by Urls.
> +%%
> %% DepInformation must be in the form of [{App, Vsn, {BareDeps,
> VersionedDeps}}, ...].
> -%% Given that information it will return the correct list of
> +%% Given that information it will return the correct list of
> %% dependencies.
> %%
> %% @spec check_project_dependencies(Urls, DepInformation, SupplimentalDeps)
> -> Deps
> %% @end
> %%--------------------------------------------------------------------
> -check_project_dependencies(Urls, DepInformation, SupplimentalDeps) ->
> - {Transformed, Apps, VList} =
> +check_project_dependencies(Prefix, Erts, DepInformation, SupplimentalDeps) ->
> + {Transformed, Apps, VList} =
> lists:foldl(fun preformat_version_data/2, {[], [], []},
> DepInformation),
> - ewr_resolver:start_link(Urls, Transformed, VList),
> - Edps = ewr_deps_engine:init(fun ewr_resolver:package_versions/1,
> + ewr_resolver:start_link(Prefix, Erts, Transformed, VList),
> + Edps = ewr_deps_engine:init(fun ewr_resolver:package_versions/1,
> fun ewr_resolver:package_dependencies/2),
> case ewr_deps_engine:deps(Edps, SupplimentalDeps ++ Apps) of
> fail ->
> @@ -76,8 +76,8 @@ check_project_dependencies(Urls, DepInformation,
> SupplimentalDeps) ->
> %%====================================================================
>
> %%--------------------------------------------------------------------
> -%% @doc
> -%% Parse the app description into a format consumable by the
> +%% @doc
> +%% Parse the app description into a format consumable by the
> %% deps engine.
> %% @spec preformat_version_data(AppInfo, Acc) -> {Deps, Pkg, Vsns}
> %% @end
> @@ -90,7 +90,7 @@ preformat_version_data({App, Vsn, {ADeps, VDeps}},
> {DepList, AppList, VsnList})
> {[{Key, NDeps} | DepList], [Key | AppList], [VKey | VsnList]}.
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Parse the version string in versioned dependencies into something
> %% usable by the system.
> %% @spec parse_vdeps(undefined, Acc) -> Deps
> diff --git a/lib/ewrepo/src/ewr_resolver.erl b/lib/ewrepo/src/ewr_resolver.erl
> index 5c5a290..f42b3a8 100644
> --- a/lib/ewrepo/src/ewr_resolver.erl
> +++ b/lib/ewrepo/src/ewr_resolver.erl
> @@ -1,25 +1,25 @@
> %%%-------------------------------------------------------------------
> %%% Copyright (c) 2007 Eric Merritt, Martin Logan
> %%%
> -%%% Permission is hereby granted, free of charge, to any
> -%%% person obtaining a copy of this software and associated
> -%%% documentation files (the "Software"), to deal in the
> -%%% Software without restriction, including without limitation
> +%%% Permission is hereby granted, free of charge, to any
> +%%% person obtaining a copy of this software and associated
> +%%% documentation files (the "Software"), to deal in the
> +%%% Software without restriction, including without limitation
> %%% the rights to use, copy, modify, merge, publish, distribute,
> -%%% sublicense, and/or sell copies of the Software, and to permit
> -%%% persons to whom the Software is furnished to do so, subject to
> +%%% sublicense, and/or sell copies of the Software, and to permit
> +%%% persons to whom the Software is furnished to do so, subject to
> %%% the following conditions:
> %%%
> -%%% The above copyright notice and this permission notice shall
> +%%% The above copyright notice and this permission notice shall
> %%% be included in all copies or substantial portions of the Software.
> %%%
> %%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> -%%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
> -%%% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> -%%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
> +%%% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
> +%%% OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> +%%% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
> %%% HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
> %%% WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> -%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> +%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> %%% OTHER DEALINGS IN THE SOFTWARE.
> %%%-------------------------------------------------------------------
> %%% @doc
> @@ -33,10 +33,10 @@
>
> -include("eunit.hrl").
>
> -
> +-compile(export_all).
>
> %% API
> --export([start_link/3,
> +-export([start_link/4,
> shutdown/0,
> package_versions/1,
> package_dependencies/2
> @@ -48,7 +48,9 @@
>
> -define(SERVER, ?MODULE).
>
> --record(state, {urls,
> +-record(state, {prefix,
> + erts_version,
> + erts_versions,
> version_list = [],
> dep_list = []}).
>
> @@ -57,17 +59,17 @@
> %%====================================================================
> %%--------------------------------------------------------------------
> %% @spec start_link(Urls, InitialDeps, InitialVsns) -> {ok,Pid} | ignore |
> {error,Error}
> -%%
> -%% @doc
> +%%
> +%% @doc
> %% Starts the server
> -%% @end
> +%% @end
> %%--------------------------------------------------------------------
> -start_link(Urls, InitialDeps, InitialVsns) ->
> - gen_server:start_link({local, ?SERVER}, ?MODULE,
> - [Urls, InitialDeps, InitialVsns], []).
> +start_link(Prefix, ErtsVersion, InitialDeps, InitialVsns) ->
> + gen_server:start_link({local, ?SERVER}, ?MODULE,
> + [Prefix, ErtsVersion, InitialDeps, InitialVsns],
> []).
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Shut down the process.
> %% @spec shutdown() -> ok
> %% @end
> @@ -76,9 +78,9 @@ shutdown() ->
> gen_server:cast(?SERVER, shutdown).
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Get the list of versions available for the specified package.
> -%%
> +%%
> %% @spec package_versions(Package) -> VersionList | Error
> %% @end
> %%--------------------------------------------------------------------
> @@ -86,15 +88,15 @@ package_versions(Package) ->
> gen_server:call(?SERVER, {package_versions, Package}, infinity).
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Get the list of dependencies for the specified package and the
> %% specified version.
> -%%
> +%%
> %% @spec package_dependencies(Package, Version) -> Deps | Error
> %% @end
> %%--------------------------------------------------------------------
> package_dependencies(Package, Version) ->
> - gen_server:call(?SERVER, {package_dependencies, Package, Version},
> + gen_server:call(?SERVER, {package_dependencies, Package, Version},
> infinity).
>
> %%====================================================================
> @@ -106,14 +108,18 @@ package_dependencies(Package, Version) ->
> %% {ok, State, Timeout} |
> %% ignore |
> %% {stop, Reason}
> -%%
> -%% @doc
> +%%
> +%% @doc
> %% Initiates the server
> -%% @end
> +%% @end
> %%--------------------------------------------------------------------
> -init([Urls, InitialDeps, InitialVsns]) ->
> - ibrowse:start(),
> - {ok, #state{urls=Urls, dep_list=InitialDeps, version_list=InitialVsns}}.
> +init([Prefix, ErtsVersion, InitialDeps, InitialVsns]) ->
> + VersionInfo = gather_version_info(Prefix, ErtsVersion),
> + {ok, #state{prefix=Prefix,
> + erts_version=ErtsVersion,
> + erts_versions=VersionInfo,
> + dep_list=InitialDeps,
> + version_list=InitialVsns}}.
>
> %%--------------------------------------------------------------------
> %% @spec handle_call(Request, From, State) -> {reply, Reply, State} |
> @@ -122,16 +128,16 @@ init([Urls, InitialDeps, InitialVsns]) ->
> %% {noreply, State, Timeout} |
> %% {stop, Reason, Reply, State} |
> %% {stop, Reason, State}
> -%%
> -%% @doc
> +%%
> +%% @doc
> %% Handling call messages
> -%% @end
> +%% @end
> %%--------------------------------------------------------------------
> handle_call({package_versions, Package}, _From, State) ->
> - try package_versions(State, Package) of
> + try package_versions(State, Package) of
> {Versions, NState} ->
> {reply, Versions, NState}
> - catch
> + catch
> throw:_ ->
> {reply, [], State}
> end;
> @@ -139,7 +145,7 @@ handle_call({package_dependencies, Package, Version},
> _From, State) ->
> try package_dependencies(State, Package, Version) of
> {Deps, NState} ->
> {reply, Deps, NState}
> - catch
> + catch
> throw:_ ->
> {reply, [], State}
> end.
> @@ -148,10 +154,10 @@ handle_call({package_dependencies, Package, Version},
> _From, State) ->
> %% @spec handle_cast(Msg, State) -> {noreply, State} |
> %% {noreply, State, Timeout} |
> %% {stop, Reason, State}
> -%%
> -%% @doc
> +%%
> +%% @doc
> %% Handling cast messages
> -%% @end
> +%% @end
> %%--------------------------------------------------------------------
> handle_cast(shutdown, State) ->
> {stop, normal, State}.
> @@ -160,33 +166,33 @@ handle_cast(shutdown, State) ->
> %% @spec handle_info(Info, State) -> {noreply, State} |
> %% {noreply, State, Timeout} |
> %% {stop, Reason, State}
> -%%
> -%% @doc
> +%%
> +%% @doc
> %% Handling all non call/cast messages
> -%% @end
> +%% @end
> %%--------------------------------------------------------------------
> handle_info(_Info, State) ->
> {noreply, State}.
>
> %%--------------------------------------------------------------------
> %% @spec terminate(Reason, State) -> void()
> -%%
> -%% @doc
> +%%
> +%% @doc
> %% This function is called by a gen_server when it is about to
> %% terminate. It should be the opposite of Module:init/1 and do any necessary
> %% cleaning up. When it returns, the gen_server terminates with Reason.
> %% The return value is ignored.
> -%% @end
> +%% @end
> %%--------------------------------------------------------------------
> terminate(_Reason, _State) ->
> ok.
>
> %%--------------------------------------------------------------------
> %% @spec code_change(OldVsn, State, Extra) -> {ok, NewState}
> -%%
> -%% @doc
> +%%
> +%% @doc
> %% Convert process state when code is changed
> -%% @end
> +%% @end
> %%--------------------------------------------------------------------
> code_change(_OldVsn, State, _Extra) ->
> {ok, State}.
> @@ -194,12 +200,144 @@ code_change(_OldVsn, State, _Extra) ->
> %%====================================================================
> %%% Internal functions
> %%====================================================================
> +%%--------------------------------------------------------------------
> +%% @doc
> +%% Get all versions that share the same major.minor version
> +%% with the current erts. Thats erts version, not app version
> +%%
> +%% @spec gather_version_info(Prefix, ErtsVersion) -> ErtsVersions
> +%% @end
> +%%--------------------------------------------------------------------
> +gather_version_info(Prefix, ErtsVersion) ->
> + ErtsVersions = lists:reverse(
> + lists:sort(
> + lists:map(fun(File) ->
> + filename:basename(File)
> + end,
> + ewl_file:list_subdirectories(
> + filename:join([Prefix, "packages"]))))),
> + NewErtsVersion = get_major_minor(ErtsVersion, 0, []),
> + lists:filter(fun(X) ->
> + starts_with(NewErtsVersion, X)
> + end,
> + ErtsVersions).
> +
> +%%--------------------------------------------------------------------
> +%% @doc
> +%% Check that list1 is the same as the first part of list2
> +%%
> +%% @spec (List1, List2) -> true | false
> +%% @end
> +%%--------------------------------------------------------------------
> +starts_with([C1 | Rest1], [C1 | Rest2]) ->
> + starts_with(Rest1, Rest2);
> +starts_with([], _) ->
> + true;
> +starts_with(_, _) ->
> + false.
>
> +%%--------------------------------------------------------------------
> +%% @doc
> +%% Get the major.minor version from version string.
> +%%
> +%% @spec (Name, Acc) -> MajorMinor
> +%% @end
> +%%--------------------------------------------------------------------
> +get_major_minor([$. | _], 1, Acc) ->
> + lists:reverse(Acc);
> +get_major_minor([$. | Rest], 0, Acc) ->
> + get_major_minor(Rest, 1, [$. | Acc]);
> +get_major_minor([Head | Rest], Count, Acc) ->
> + get_major_minor(Rest, Count, [Head | Acc]);
> +get_major_minor([], _, Acc) ->
> + lists:reverse(Acc).
> +
> +%%--------------------------------------------------------------------
> +%% @doc
> +%% Get the version from an app-version
> +%%
> +%% @spec (Name) -> Version
> +%% @end
> +%%--------------------------------------------------------------------
> +get_version([$- | Rest]) ->
> + Rest;
> +get_version([_ | Rest]) ->
> + get_version(Rest);
> +get_version([]) ->
> + throw({error, "Unable to find package version"}).
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> +%% Acc is a set. It this just makes sure only one entry is in the set
> +%%
> +%% @spec (Name, Acc) -> NewAcc
> +%% @end
> +%%--------------------------------------------------------------------
> +add_to_acc([Name | Rest1] , [Name | _], Acc) ->
> + add_to_acc(Rest1, Acc, Acc);
> +add_to_acc(All, [_ | Rest], Acc) ->
> + add_to_acc(All, Rest, Acc);
> +add_to_acc([Name | Rest], [], Acc) ->
> + NewAcc = [Name | Acc],
> + add_to_acc(Rest, NewAcc, NewAcc);
> +add_to_acc([], [], Acc) ->
> + lists:reverse(Acc).
> +
> +%%--------------------------------------------------------------------
> +%% @doc
> +%% Get all the versions for a package, search across all
> +%% relavent major/minor versions.
> +%%
> +%% @spec (Package, Prefix, Versions, Acc) -> Versions
> +%% @end
> +%%--------------------------------------------------------------------
> +get_package_versions(Package, Prefix, [ErtsVersion | ErtsVersions], Acc) ->
> + FileName = filename:join([Prefix, "packages", ErtsVersion,
> + "lib"]),
> + AppVersions = lists:filter(fun(X) ->
> + starts_with(atom_to_list(Package) ++
> "-", filename:basename(X))
> + end,
> + ewl_file:list_subdirectories(FileName)),
> + Versions = lists:map(fun(X) ->
> + get_version(X)
> + end,
> + AppVersions),
> + get_package_versions(Package, Prefix, ErtsVersions,
> + add_to_acc(Versions, Acc, Acc));
> +get_package_versions(_, _, [], Acc) ->
> + Acc.
> +
> +%%--------------------------------------------------------------------
> +%% @doc
> +%% Get the dependencies for a package and version.
> +%%
> +%% @spec (Package, Version, Prefix, Versions) -> Deps
> +%% @end
> +%%--------------------------------------------------------------------
> +get_package_dependencies(Package, Version, Prefix, [ErtsVersion |
> ErtsVersions]) ->
> + PackageName = lists:flatten([Package, "-", Version]),
> + AppName = lists:flatten([Package, ".app"]),
> + FileName = filename:join([Prefix, "packages", ErtsVersion,
> + "lib", PackageName]),
> +
> + case filelib:is_dir(FileName) of
> + true ->
> + case file:consult(filename:join([FileName, "ebin", AppName])) of
> + {ok, [Term]} ->
> + handle_parse_output(Term);
> + {error, _} ->
> + throw({error, "Unable to find dependencies for package"})
> + end;
> + false ->
> + get_package_dependencies(Package, Version, Prefix, ErtsVersions)
> + end;
> +get_package_dependencies(_, _, _, []) ->
> + throw({error, "Unable to find dependencies for package"}).
> +
> +%%--------------------------------------------------------------------
> +%% @doc
> %% Get the list of versions available for the specified package.
> -%%
> +%%
> %% @spec package_versions(Urls, Package) -> VersionList | Error
> %% @end
> %%--------------------------------------------------------------------
> @@ -209,9 +347,11 @@ package_versions(State, Package) when is_atom(Package) ->
> {value, {Package, Versions}} ->
> {Versions, State};
> false ->
> - Suffix = ewr_util:gen_metadata_stub_suffix(Package),
> - Versions = try_get_package_versions(State#state.urls, Suffix),
> - {Versions, State#state{version_list=[{Package, Versions} |
> VList]}}
> + Versions = get_package_versions(Package,
> + State#state.prefix,
> + State#state.erts_versions,
> + []),
> + {Versions, State#state{version_list=[{Package, Versions} |
> VList]}}
> end;
> package_versions(_, _) ->
> throw({error, "Package name must be an atom"}).
> @@ -219,10 +359,10 @@ package_versions(_, _) ->
>
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Get the list of dependencies for the specified package and the
> %% specified version.
> -%%
> +%%
> %% @spec package_dependencies(Urls, Package, Version) -> Deps | Error
> %% @end
> %%--------------------------------------------------------------------
> @@ -234,109 +374,16 @@ package_dependencies(State, Package, Version) ->
> {Value, State};
> false ->
> NPackage = atom_to_list(Package),
> - NVersion = ewr_util:version_to_string(Version),
> - Suffix = ewr_util:gen_metadata_suffix(NPackage, NVersion),
> - NDeps = try_get_package_dependencies(State#state.urls,
> - NPackage, Suffix),
> + NDeps = get_package_dependencies(NPackage,
> + Version,
> + State#state.prefix,
> + State#state.erts_versions),
> {NDeps, State#state{dep_list=[{Key, NDeps} | Deps]}}
> end.
>
>
> %%--------------------------------------------------------------------
> -%% @doc
> -%% Try to get the list of package dependencies
> -%%
> -%% @spec try_get_package_dependencies(Urls, Package, Suffix) -> DepList |
> {error, Reason}
> -%% @end
> -%%--------------------------------------------------------------------
> -try_get_package_dependencies([Url | T], Package, Suffix) ->
> - NUrl = lists:flatten([Url, Suffix, Package, ".app"]),
> - case ewr_util:consult_url(NUrl) of
> - {ok, Term} ->
> - handle_parse_output(Term);
> - {error, _} ->
> - try_get_package_dependencies(T, Package, Suffix)
> - end;
> -try_get_package_dependencies(_, Package, _) ->
> - error_logger:warning_msg("Package ~w is not in repository! unable to "
> - "resolve dependencies.~n",
> - [Package]),
> - throw({error, "Unable to find package dependecies"}).
> -
> -%%--------------------------------------------------------------------
> -%% @doc
> -%% Try to get the list of package versions from the system.
> -%%
> -%% @spec try_get_package_versions(Urls, Suffix) -> Term | {error, Reason}
> -%% @end
> -%%--------------------------------------------------------------------
> -try_get_package_versions([Url | T], Suffix) ->
> - NUrl = lists:flatten([Url, Suffix]),
> - case ibrowse:send_req(NUrl, [{"Connection", "TE"},
> - {"TE", "trailers"},
> - {"Depth", "1"},
> - {"Content-Type", "application/xml"}],
> - propfind, "") of
> - {ok, "207", _, Body} ->
> - parse_out_package_version(Body);
> - {ok, _, _, _} ->
> - try_get_package_versions(T, Suffix);
> - {error, _} ->
> - try_get_package_versions(T, Suffix)
> - end;
> -try_get_package_versions([], Suffix) ->
> - error_logger:warning_msg("Unable to find version list at ~s. Package
> probably "
> - "isn't in any of the available repositories~n",
> [Suffix]),
> - throw({error, "Unable to find version list"}).
> -
> -
> -%%--------------------------------------------------------------------
> -%% @doc
> -%% Parse out the package version list from the returned string.
> -%% @spec parse_out_package_version(Body) -> VersionList
> -%% @end
> -%%--------------------------------------------------------------------
> -parse_out_package_version(Body) ->
> - case xmerl_scan:string(Body, []) of
> - {Elem, _} ->
> - get_package_versions(Elem);
> - Err ->
> - throw(Err)
> - end.
> -
> -%%--------------------------------------------------------------------
> -%% @doc
> -%% Get the list of items from the parsed xml.
> -%% @spec get_package_versions(Elem) -> Vn
> -%% @end
> -%%--------------------------------------------------------------------
> -get_package_versions(Elem) ->
> - case lists:sort(xmerl_xs:value_of(xmerl_xs:select("//D:href", Elem))) of
> - [H | T] ->
> - gather_versions(H, T);
> - [] ->
> - [];
> - Else ->
> - throw({error, {got_from_url, Else}})
> - end.
> -
> -%%--------------------------------------------------------------------
> -%% @doc
> -%% Parse out the version from the full url.
> -%% @spec gather_versions(Base, Rest) -> VersionList
> -%% @end
> -%%--------------------------------------------------------------------
> -gather_versions(Base, Rest) ->
> - gather_versions(length(Base), Rest, []).
> -
> -gather_versions(Base, [H | T], Acc) ->
> - gather_versions(Base, T,
> - [ewr_util:parse_version(string:strip(lists:nthtail(Base, H), both,
> $/)) | Acc]);
> -gather_versions(_Base, [], Acc) ->
> - Acc.
> -
> -%%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% get the version the deps and the versioned deps from an *.app
> %% term.
> %%
> @@ -348,12 +395,12 @@ handle_parse_output({application, _, Ops}) ->
> Deps = lists:umerge(lists:sort(get_deps(Ops)),
> lists:sort(get_ideps(Ops))),
> ewr_util:merge_per_app_deps(Deps, VDeps);
> -handle_parse_output(_) ->
> +handle_parse_output(Av) ->
> throw({error, "Invalid dependency info"}).
>
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Get the list of versioned dependencies from the op list.
> %% @spec get_vdeps(OppList) -> VersionedDependencies
> %% @end
> @@ -367,7 +414,7 @@ get_vdeps([]) ->
> undefined.
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Process the list of versioned dependencies.
> %% @spec process_vdeps(VList, Acc) -> VersionedList
> %% @end
> @@ -381,7 +428,7 @@ process_vdeps([], Acc) ->
> Acc.
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Get the list of non-versioned dependencies from the oplist. This
> %% is specifed in the applications entry.
> %% @spec get_deps(OpList) -> Dependencies
> @@ -397,7 +444,7 @@ get_deps([]) ->
>
>
> %%--------------------------------------------------------------------
> -%% @doc
> +%% @doc
> %% Get the list of included applications.
> %% @spec get_ideps(OpList) -> IncludedDependencies
> %% @end
> @@ -410,8 +457,6 @@ get_ideps([_ | T]) ->
> get_ideps([]) ->
> [].
>
> -
> -
> %%====================================================================
> %% tests
> %%====================================================================
> @@ -423,8 +468,30 @@ handle_parse_output_test() ->
> [{app1, "0.1.0"}, {app2, "0.33.1", gte},
> {app3, "33.11.3"}]},
> {applications, [app1, app2, app3, app4, app5]}]},
> - ?assertMatch([{app3, [33, 11, 3]}, {app2, [0, 33, 1],gte},
> + ?assertMatch([{app3, [33, 11, 3]}, {app2, [0, 33, 1],gte},
> {app1, [0, 1, 0]}, app5, app4],
> handle_parse_output(Data)).
>
> -
> +starts_with_test() ->
> + ?assertMatch(true, starts_with("onetwo", "onetwothree")),
> + ?assertMatch(false, starts_with("onetwo", "threetwoone")).
> +
> +get_major_minor_test() ->
> + ?assertMatch("5.6", get_major_minor("5.6.3", 0, [])),
> + ?assertMatch("5.5", get_major_minor("5.5.5", 0, [])).
> +
> +get_version_test() ->
> + ?assertMatch("1.0", get_version("sinan-1.0")),
> + ?assertMatch("1.3.2.2", get_version("bah-1.3.2.2")).
> +
> +add_to_acc_test() ->
> + Start = ["one", "two", "one", "three", "four", "two"],
> + ?assertMatch(["one", "two", "three", "four"], add_to_acc(Start, [], [])).
> +
> +gather_version_info_test() ->
> + Prefix = "/usr/local/erlware",
> + Version = "5.6.3",
> + ?assertMatch([Version], gather_version_info(Prefix, Version)).
> +
> +get_package_versions_test() ->
> + ?assertMatch(["10.0.1"], get_package_versions(sinan,
> "/usr/local/erlware", ["5.6.3"], [])).
> --
> 1.5.6.4
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"erlware-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/erlware-dev?hl=en
-~----------~----~----~----~------~----~------~--~---