On Wed, 2009-01-21 at 21:21 -0600, Eric Merritt wrote:
> Mikael,
> 
>  Whats the goal here? Would you mind amending the patch with a bit of
> description around the reason?
> 
> Btw, thanks a million I really appreciate the help.
> 
> eric
> 

I added sin_resolver.erl from sinan version 0.11.0.3 to get sinan/next
to build. But I guess you or Martin Logan may have a newer version
locally you want to commit instead. And if you don't disregard my patch
anyway and commit your local version of sin_resolver.erl, since you are
the authors of the file. I'm happy as long as the file is added to
sinan/next in one way or another.

Thanks,
Mikael

> On Sun, Jan 18, 2009 at 4:00 AM, Mikael Magnusson <[email protected]> wrote:
> >
> > From: Mikael Magnusson <[email protected]>
> >
> > Signed-off-by: Mikael Magnusson <[email protected]>
> > ---
> >  server/sinan/src/sin_resolver.erl |  344 
> > +++++++++++++++++++++++++++++++++++++
> >  1 files changed, 344 insertions(+), 0 deletions(-)
> >  create mode 100644 server/sinan/src/sin_resolver.erl
> >
> > diff --git a/server/sinan/src/sin_resolver.erl 
> > b/server/sinan/src/sin_resolver.erl
> > new file mode 100644
> > index 0000000..203bb9a
> > --- /dev/null
> > +++ b/server/sinan/src/sin_resolver.erl
> > @@ -0,0 +1,344 @@
> > +%%%-------------------------------------------------------------------
> > +%%% 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
> > +%%% 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
> > +%%% the following conditions:
> > +%%%
> > +%%% 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
> > +%%% 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
> > +%%% OTHER DEALINGS IN THE SOFTWARE.
> > +%%%-------------------------------------------------------------------
> > +%%% @doc
> > +%%%  Resolves individual items for the dependency engine.
> > +%%% @copyright Erlware 2007
> > +%%% @end
> > +%%%-------------------------------------------------------------------
> > +-module(sin_resolver).
> > +
> > +-include("eunit.hrl").
> > +
> > +%% API
> > +-export([package_versions/3,
> > +         package_dependencies/4,
> > +        find_package_location/4,
> > +        gather_version_info/2]).
> > +
> > +
> > +
> > +%%====================================================================
> > +%% API
> > +%%====================================================================
> > +%%--------------------------------------------------------------------
> > +%% @doc
> > +%%  Get the list of versions available for the specified package.
> > +%%
> > +%% @spec (Prefix, ErtsVersion, Package) -> VersionList
> > +%% @end
> > +%%--------------------------------------------------------------------
> > +package_versions(Prefix, ErtsVersion, Package) when is_atom(Package) ->
> > +    VList = gather_version_info(Prefix, ErtsVersion),
> > +    get_package_versions(Package,
> > +                        Prefix,
> > +                        VList,
> > +                        []);
> > +package_versions(_, _, _) ->
> > +    throw({error, "Package name must be an atom"}).
> > +
> > +%%--------------------------------------------------------------------
> > +%% @doc
> > +%%  Get the list of dependencies for the specified package and the
> > +%%  specified version.
> > +%%
> > +%% @spec (Prefix, ErtsVersion, Package, Version) -> Deps | Error
> > +%% @end
> > +%%--------------------------------------------------------------------
> > +package_dependencies(Prefix, ErtsVersion, Package, Version) ->
> > +    VList = gather_version_info(Prefix, ErtsVersion),
> > +    NPackage = atom_to_list(Package),
> > +    NDeps = get_package_dependencies(NPackage,
> > +                                    Version,
> > +                                    Prefix,
> > +                                    VList),
> > +    NDeps.
> > +
> > +
> > +%%--------------------------------------------------------------------
> > +%% @doc
> > +%%  Get the dependencies for a package and version.
> > +%%
> > +%% @spec (Package, Version, Prefix, Versions) -> Location
> > +%% @end
> > +%%--------------------------------------------------------------------
> > +find_package_location(Prefix, ErtsVersion, Package, Version) ->
> > +    VList = gather_version_info(Prefix, ErtsVersion),
> > +    find_package_location_across_versions(Package, Version, Prefix, VList).
> > +
> > +
> > +%%====================================================================
> > +%%% Internal 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
> > +%%  Get the dependencies for a package and version.
> > +%%
> > +%% @spec (Package, Version, Prefix, Versions) -> Location
> > +%% @end
> > +%%--------------------------------------------------------------------
> > +find_package_location_across_versions(Package, Version,
> > +                                     Prefix, [ErtsVersion | ErtsVersions]) 
> > ->
> > +    PackageName = lists:flatten([Package, "-", Version]),
> > +    FileName = filename:join([Prefix, "packages", ErtsVersion,
> > +                             "lib", PackageName]),
> > +    case filelib:is_dir(FileName) of
> > +       true ->
> > +           FileName;
> > +       false ->
> > +           find_package_location_across_versions(Package, Version,
> > +                                                 Prefix, ErtsVersions)
> > +    end;
> > +find_package_location_across_versions(_, _, _, []) ->
> > +    throw({error, "Unable to find location for package"}).
> > +
> > +%%--------------------------------------------------------------------
> > +%% @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,
> > +                                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, Count, 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
> > +%%  Acc is a set. It this just makes sure only one entry is in the set
> > +%%
> > +%% @spec (Name, In, 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,
> > +                              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]) ->
> > +    DotAppName = lists:flatten([Package, ".app"]),
> > +    AppName = lists:flatten([Package, "-", Version]),
> > +    case file:consult(filename:join([Prefix, "packages",
> > +                                    ErtsVersion, "lib", AppName,
> > +                                    "ebin", DotAppName])) of
> > +       {ok, [Term]} ->
> > +           handle_parse_output(Term);
> > +       {error, _} ->
> > +           get_package_dependencies(Package, Version, Prefix,
> > +                                    [ErtsVersion | ErtsVersions])
> > +    end;
> > +get_package_dependencies(_, _, _, []) ->
> > +    throw({error, "Unable to find dependencies for package"}).
> > +
> > +
> > +
> > +
> > +%%--------------------------------------------------------------------
> > +%% @doc
> > +%%  get the version the deps and the versioned deps from an *.app
> > +%%  term.
> > +%%
> > +%% @spec handle_parse_output(AppTerm) -> {Vsn, VersionedDeps, Deps} | 
> > {error, Reason}
> > +%% @end
> > +%%--------------------------------------------------------------------
> > +handle_parse_output({application, _, Ops}) ->
> > +    lists:umerge(lists:sort(get_deps(Ops)),
> > +                lists:sort(get_ideps(Ops)));
> > +handle_parse_output(_) ->
> > +   throw({error, "Invalid dependency info"}).
> > +
> > +
> > +
> > +%%--------------------------------------------------------------------
> > +%% @doc
> > +%%  Get the list of non-versioned dependencies from the oplist. This
> > +%%  is specifed in the applications entry.
> > +%% @spec get_deps(OpList) -> Dependencies
> > +%% @end
> > +%% @private
> > +%%--------------------------------------------------------------------
> > +get_deps([{applications, List} | _T]) ->
> > +    List;
> > +get_deps([_ | T]) ->
> > +    get_deps(T);
> > +get_deps([]) ->
> > +    [].
> > +
> > +
> > +%%--------------------------------------------------------------------
> > +%% @doc
> > +%%  Get the list of included applications.
> > +%% @spec get_ideps(OpList) -> IncludedDependencies
> > +%% @end
> > +%% @private
> > +%%--------------------------------------------------------------------
> > +get_ideps([{included_applications, List} | _T]) ->
> > +    List;
> > +get_ideps([_ | T]) ->
> > +    get_ideps(T);
> > +get_ideps([]) ->
> > +    [].
> > +
> > +%%====================================================================
> > +%% tests
> > +%%====================================================================
> > +handle_parse_output_test() ->
> > +    Data = {application, testapp,
> > +            [{vsn, "0.1.0"},
> > +             {description, "test test test"},
> > +             {versioned_dependencies,
> > +              [{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},
> > +                  {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.3
> >
> >
> > >
> >
> 
> > 

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to