% 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.

% Set the path to the configuration environment generated
% by `./configure`.

COUCHDB_ROOT = filename:dirname(SCRIPT).
os:putenv("COUCHDB_ROOT", COUCHDB_ROOT).

ConfigureEnv = filename:join(COUCHDB_ROOT, "config.erl").
os:putenv("COUCHDB_CONFIG", ConfigureEnv).

os:putenv("COUCHDB_APPS_CONFIG_DIR", filename:join([COUCHDB_ROOT, "rel/apps"])).

DepDescs = [
%% must be compiled first as it has a custom behavior
{couch_epi,        "couch-epi",        "f6ad55d804ac741b59fe37dd092787113847661c"},
{config,           "config",           "12dcbf571516970f7cfa586bda9a1f1cad82d5bb"},
%% keep these sorted
{b64url,           "b64url",           "6895652d80f95cdf04efb14625abed868998f174"},
{couch_log,        "couch-log",        "2f70cc8ddb1a6a8d512aa53490138d9c2754eb07"},
{chttpd,           "chttpd",           "663273b0ed2ea4eae16d9d36e1922138fb25e766"},
{couch,            "couch",            "1df597fc2e9a8208e7716f8542a7f6a8e9b606e8"},
{couch_index,      "couch-index",      "e7d269800302224eacf9585f74eb30822495755b"},
{couch_mrview,     "couch-mrview",     "157132c6e603b1870a08c04e8459a177387932ed"},
{couch_replicator, "couch-replicator", "05247a26019ce5416e13ef80a12c307bdc790ee4"},
{couch_plugins,    "couch-plugins",    "3e73b723cb126cfc471b560d17c24a8b5c540085"},
{couch_event,      "couch-event",      "835a41885d1e276d207758954f8238aa7bba0ae8"},
{couch_stats,      "couch-stats",      "7895d4d3f509ed24f09b6d1a0bd0e06af34551dc"},
{couch_peruser,    "peruser",          "ff7d190970a46722137fbc7a1a75466e8a544ae1"},
{couch_tests,       "erlang-tests",    "37b3bfeb4b1a48a592456e67991362e155ed81e0"},
{docs,             "documentation",    "59edec50399484ebf0bf784faf28ca6a2f4e8829", [raw]},
{ddoc_cache,       "ddoc-cache",       "c762e90a33ce3cda19ef142dd1120f1087ecd876"},
{ets_lru,          "ets-lru",          "c05488c8b1d7ec1c3554a828e0c9bf2888932ed6"},
{fabric,           "fabric",           "78eb096dae277facc5cf4f6f166e5591da6c165f"},
{fauxton,          "fauxton",          {tag, "v1.1.7"}, [raw]},
{folsom,           "folsom",           "a5c95dec18227c977029fbd3b638966d98f17003"},
{global_changes,   "global-changes",   "203fb088ed81149108e64d18ffd9c3f5df154f97"},
{ibrowse,          "ibrowse",          "4af2d408607874d124414ac45df1edbe3961d1cd"},
{ioq,              "ioq",              "c7c75ebeaf41599e3a3e211097d864f0e7785829"},
{jiffy,            "jiffy",            "d3c00e19d8fa20c21758402231247602190988d3"},
{khash,            "khash",            "7c6a9cd9776b5c6f063ccafedfa984b00877b019"},
{mango,            "mango",            "01252f971bef0c8da1d78bf5a7b506b71926ce1b"},
{mem3,             "mem3",             "15615b295ec970ca9b12b7b54107a80b95149511"},
{mochiweb,         "mochiweb",         "bd6ae7cbb371666a1f68115056f7b30d13765782"},
{oauth,            "oauth",            "099057a98e41f3aff91e77e3cf496d6c6fd901df"},
{rexi,             "rexi",             "a327b7dbeb2b0050f7ca9072047bf8ef2d282833"},
{snappy,           "snappy",           "a728b960611d0795025de7e9668d06b9926c479d"},
{setup,            "setup",            "b9e1f3b5d5a78a706abb358e17130fb7344567d2"},
{meck,             "meck",             {tag, "0.8.2"}}
],

BaseUrl = "https://git-wip-us.apache.org/repos/asf/",

MakeDep = fun
    ({AppName, {url, Url}, Version}) ->
        {AppName, ".*", {git, Url, Version}};
    ({AppName, {url, Url}, Version, Options}) ->
        {AppName, ".*", {git, Url, Version}, Options};
    ({AppName, RepoName, Version}) ->
        Url = BaseUrl ++ "couchdb-" ++ RepoName ++ ".git",
        {AppName, ".*", {git, Url, Version}};
    ({AppName, RepoName, Version, Options}) ->
        Url = BaseUrl ++ "couchdb-" ++ RepoName ++ ".git",
        {AppName, ".*", {git, Url, Version}, Options}
end,

AddConfig = [
    {require_otp_vsn, "R16B03|R16B03-1|17|18|19"},
    {deps_dir, "src"},
    {deps, lists:map(MakeDep, DepDescs)},
    {sub_dirs, ["rel"]},
    {lib_dirs, ["src/"]},
    {erl_opts, [debug_info]},
    {eunit_opts, [verbose]},
    {plugins, [eunit_plugin]},
    {dialyzer, [
        {plt_location, local},
        {plt_location, COUCHDB_ROOT},
        {plt_extra_apps, [
            asn1, compiler, crypto, inets, kernel, os_mon, runtime_tools,
            sasl, ssl, stdlib, syntax_tools, xmerl]},
        {warnings, [unmatched_returns, error_handling, race_conditions]}]},
    {post_hooks, [{compile, "escript support/build_js.escript"}]}
],

C = lists:foldl(fun({K, V}, CfgAcc) ->
    lists:keystore(K, 1, CfgAcc, {K, V})
end, CONFIG, AddConfig).
