93 lines
3.6 KiB
Erlang
93 lines
3.6 KiB
Erlang
|
%% @author Justin Sheehy <justin@basho.com>
|
||
|
%% @author Andy Gross <andy@basho.com>
|
||
|
%% @copyright 2007-2008 Basho Technologies
|
||
|
%%
|
||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
%% you may not use this file except in compliance with the License.
|
||
|
%% You may obtain a copy of the License at
|
||
|
%%
|
||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||
|
%%
|
||
|
%% Unless required by applicable law or agreed to in writing, software
|
||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
%% See the License for the specific language governing permissions and
|
||
|
%% limitations under the License.
|
||
|
|
||
|
%% @doc Ensure that the relatively-installed dependencies are on the code
|
||
|
%% loading path, and locate resources relative
|
||
|
%% to this application's path.
|
||
|
|
||
|
-module(webmachine_deps).
|
||
|
-author('Justin Sheehy <justin@basho.com>').
|
||
|
-author('Andy Gross <andy@basho.com>').
|
||
|
|
||
|
-export([ensure/0, ensure/1]).
|
||
|
-export([get_base_dir/0, get_base_dir/1]).
|
||
|
-export([local_path/1, local_path/2]).
|
||
|
-export([deps_on_path/0, new_siblings/1]).
|
||
|
|
||
|
%% @spec deps_on_path() -> [ProjNameAndVers]
|
||
|
%% @doc List of project dependencies on the path.
|
||
|
deps_on_path() ->
|
||
|
ordsets:from_list([filename:basename(filename:dirname(X)) || X <- code:get_path()]).
|
||
|
|
||
|
%% @spec new_siblings(Module) -> [Dir]
|
||
|
%% @doc Find new siblings paths relative to Module that aren't already on the
|
||
|
%% code path.
|
||
|
new_siblings(Module) ->
|
||
|
Existing = deps_on_path(),
|
||
|
SiblingEbin = [ X || X <- filelib:wildcard(local_path(["deps", "*", "ebin"], Module)),
|
||
|
filename:basename(filename:dirname(X)) /= %% don't include self
|
||
|
filename:basename(filename:dirname(
|
||
|
filename:dirname(
|
||
|
filename:dirname(X)))) ],
|
||
|
Siblings = [filename:dirname(X) || X <- SiblingEbin,
|
||
|
ordsets:is_element(
|
||
|
filename:basename(filename:dirname(X)),
|
||
|
Existing) =:= false],
|
||
|
lists:filter(fun filelib:is_dir/1,
|
||
|
lists:append([[filename:join([X, "ebin"]),
|
||
|
filename:join([X, "include"])] ||
|
||
|
X <- Siblings])).
|
||
|
|
||
|
|
||
|
%% @spec ensure(Module) -> ok
|
||
|
%% @doc Ensure that all ebin and include paths for dependencies
|
||
|
%% of the application for Module are on the code path.
|
||
|
ensure(Module) ->
|
||
|
code:add_paths(new_siblings(Module)),
|
||
|
code:clash(),
|
||
|
ok.
|
||
|
|
||
|
%% @spec ensure() -> ok
|
||
|
%% @doc Ensure that the ebin and include paths for dependencies of
|
||
|
%% this application are on the code path. Equivalent to
|
||
|
%% ensure(?Module).
|
||
|
ensure() ->
|
||
|
ensure(?MODULE).
|
||
|
|
||
|
%% @spec get_base_dir(Module) -> string()
|
||
|
%% @doc Return the application directory for Module. It assumes Module is in
|
||
|
%% a standard OTP layout application in the ebin or src directory.
|
||
|
get_base_dir(Module) ->
|
||
|
{file, Here} = code:is_loaded(Module),
|
||
|
filename:dirname(filename:dirname(Here)).
|
||
|
|
||
|
%% @spec get_base_dir() -> string()
|
||
|
%% @doc Return the application directory for this application. Equivalent to
|
||
|
%% get_base_dir(?MODULE).
|
||
|
get_base_dir() ->
|
||
|
get_base_dir(?MODULE).
|
||
|
|
||
|
%% @spec local_path([string()], Module) -> string()
|
||
|
%% @doc Return an application-relative directory from Module's application.
|
||
|
local_path(Components, Module) ->
|
||
|
filename:join([get_base_dir(Module) | Components]).
|
||
|
|
||
|
%% @spec local_path(Components) -> string()
|
||
|
%% @doc Return an application-relative directory for this application.
|
||
|
%% Equivalent to local_path(Components, ?MODULE).
|
||
|
local_path(Components) ->
|
||
|
local_path(Components, ?MODULE).
|