blob: 322963b8fa6d2bb632f52630bca4cce691bef45e [file] [log] [blame]
%% -*- erlang -*-
% 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.
%
% Blacklist some bad releases.
%
{ok, Version} = file:read_file(filename:join(
[code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"]
)).
% Version may be binary if file has /n at end :(
% there is no string:trim/1 in Erlang 19 :(
VerString = case Version of
V when is_binary(V) -> string:strip(binary_to_list(V), right, $\n);
_ -> string:strip(Version, right, $\n)
end.
VerList = lists:map(fun(X) -> {Int, _} = string:to_integer(X), Int end,
string:tokens(VerString, ".")).
DisplayMsg = fun(Msg, Args) ->
Base = iolist_to_binary(io_lib:format(Msg, Args)),
Lines = binary:split(Base, <<"\n">>, [global]),
MaxLen = lists:foldl(fun(Line, Acc) ->
max(Acc, size(Line))
end, 0, Lines),
Decoration = iolist_to_binary(["*" || _ <- lists:seq(1, MaxLen)]),
ReNewLined = [[L, "~n"] || L <- Lines],
NewLines = ["~n", Decoration, "~n", ReNewLined, Decoration, "~n~n"],
MsgBin = iolist_to_binary(NewLines),
io:format(binary_to_list(MsgBin), [])
end.
ErlangTooOld = fun(Ver) ->
DisplayMsg(
"This version of Erlang (~p) is too old for use with Apache CouchDB.~n~n"
"See https://docs.couchdb.org/en/stable/install/unix.html#dependencies~n"
"for the latest information on dependencies.",
[Ver]
),
halt(1)
end.
NotSupported = fun(Ver) ->
DisplayMsg(
"This version of Erlang (~p) is not officially supported by Apache~n"
"CouchDB. While we do not officially support this version, there~n"
"are also no known bugs or incompatibilities.~n~n"
"See https://docs.couchdb.org/en/stable/install/unix.html#dependencies~n"
"for the latest information on dependencies.",
[Ver]
)
end.
BadErlang = fun(Ver) ->
DisplayMsg(
"This version of Erlang (~p) is known to contain bugs that directly~n"
"affect the correctness of Apache CouchDB.~n~n"
"You should *NOT* use this version of Erlang.~n~n"
"See https://docs.couchdb.org/en/stable/install/unix.html#dependencies~n"
"for the latest information on dependencies.",
[Ver]
),
case os:getenv("TRAVIS") of
"true" ->
io:fwrite("Travis run, ignoring bad release. You have been warned!~n"),
ok;
_ ->
halt(1)
end
end.
case VerList of
% Leave example around if we have to exlude specific versions
% [22, 0, N | _] when N < 5 -> BadErlang(VerString);
_ -> ok
end.
% 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).
CouchConfig = case filelib:is_file(ConfigureEnv) of
true ->
{ok, Result} = file:consult(ConfigureEnv),
Result;
false ->
[]
end.
os:putenv("COUCHDB_APPS_CONFIG_DIR", filename:join([COUCHDB_ROOT, "rel/apps"])).
WithProper = lists:keyfind(with_proper, 1, CouchConfig) == {with_proper, true}.
OptionalDeps = case WithProper of
true ->
[{proper, {url, "https://github.com/proper-testing/proper"}, {tag, "v1.4"}}];
false ->
[]
end.
AddConfig = [
{require_otp_vsn, "23|24|25"},
{deps_error_on_conflict, true},
{deps, [
{proper, {git, "https://github.com/proper-testing/proper", {ref, "cfc29e7615ec0a93ac0be619d33609c2139b57fd"}}},
{config, {git, "https://github.com/jiahuili430/couchdb-config.git", {ref,"0571481ed314c77a6e7e44ec904afa0109860591"}}},
{bear, {git, "https://github.com/jiahuili430/couchdb-bear.git", {ref,"da1e52678d628b394d4bf241ccbe410ab90fd1e3"}}},
{b64url, {git, "https://github.com/apache/couchdb-b64url.git", {ref, "ef4fca0c8d18b963412fc16f5848e95944977927"}}},
{ets_lru, {git, "https://github.com/apache/couchdb-ets-lru.git", {ref, "f1ca157d6f96c9edf343e280709085f9eed1e716"}}},
{ibrowse, {git, "https://github.com/apache/couchdb-ibrowse.git", {ref, "a62d4a6d236729e5869842c70447ad46b3409912"}}},
{jiffy, {git, "https://github.com/apache/couchdb-jiffy.git", {ref, "9ea1b35b6e60ba21dfd4adbd18e7916a831fd7d4"}}},
{mochiweb, {git, "https://github.com/apache/couchdb-mochiweb.git", {ref, "845803a5defa693c546ea7250818f226a52d2891"}}},
{meck, {git, "https://github.com/apache/couchdb-meck.git", {ref, "cc47aab4b64a46a5409c1a93353d44a367b41454"}}},
{recon, {git, "https://github.com/apache/couchdb-recon", {ref, "34194da6d9f8ed25f274e0ebb098dc9e95bcf547"}}},
{khash, {git, "https://github.com/jiahuili430/couchdb-khash", {ref, "4a0e07f7a2870a543510db355d6c2e9c3c1d84b1"}}},
{snappy, {git, "https://github.com/jiahuili430/couchdb-snappy.git", {ref, "536286ada94a3aeee6042d047f3a9c369a5f1475"}}},
{folsom, {git, "https://github.com/jiahuili430/couchdb-folsom.git", {ref, "87f778c1efb11e9caebba328a2cba05453db668c"}}},
{hyper, {git, "https://github.com/jiahuili430/couchdb-hyper.git", {ref, "69fa387bc9cd67dbe2f4649b4ebd2239e879f239"}}}
]},
{plugins, [ic, erlfmt, rebar3_path_deps]},
{erlfmt, [write]},
{erl_opts, [
{i, "../"},
{i, "src/couch_tests/include"},
{i, "src/mochiweb/include"},
{i, "src/rexi/include"},
{i, "src/proper/include"},
{i, "src/folsom/include"},
{i, "src/mem3/include"},
{i, "src/couch_mrview/include"},
{i, "src/couch/include"},
{i, "src/couch_replicator/include"},
{i, "src/meck/test/include"},
{i, "src/couch_log/include"},
{i, "src/dreyfus/include"},
{i, "src/chttpd/include"},
{i, "src/ibrowse/include"},
{i, "src/fabric/include"},
{d, 'COUCHDB_ERLANG_VERSION', VerString}
]},
{eunit_opts, [
verbose,
{report, {eunit_progress, [colored, profile]}},
{report, {eunit_surefire, [{dir, "_build/test"}]}}
]},
{project_app_dirs, ["src/*"]},
{eunit_tests, [
%{application, b64url},
{application, chttpd},
%{application, config},
{application, couch_dist},
{application, couch_event},
{application, couch_index},
{application, couch_log},
{application, couch_mrview},
{application, couch_peruser},
{application, couch_plugins},
{application, couch_prometheus},
{application, couch_pse_tests},
{application, couch_replicator},
{application, couch_stats},
{application, couch_tests},
{application, couch},
{application, custodian},
{application, ddoc_cache},
{application, dreyfus},
%{application, ets_lru},
{application, fabric},
{application, global_changes},
{application, ioq},
%{application, jiffy},
{application, jwtf},
{application, ken},
%{application, khash},
{application, mango},
{application, mem3},
%{application, recon},
{application, rexi},
{application, setup},
{application, smoosh},
{application, weatherreport},
{application, couch_epi}
]},
{profiles, [{test, [
{extra_src_dirs, [{"test", [{recursive, true}]}]},
{deps, [
% {b64url, {git, "https://github.com/apache/couchdb-b64url.git", {ref, "ef4fca0c8d18b963412fc16f5848e95944977927"}}},
% {ets_lru, {git, "https://github.com/apache/couchdb-ets-lru.git", {ref, "f1ca157d6f96c9edf343e280709085f9eed1e716"}}},
% {jiffy, {git, "https://github.com/apache/couchdb-jiffy.git", {ref, "9ea1b35b6e60ba21dfd4adbd18e7916a831fd7d4"}}},
% {config, {git, "https://github.com/jiahuili430/couchdb-config.git", {ref,"0571481ed314c77a6e7e44ec904afa0109860591"}}},
% {khash, {git, "https://github.com/jiahuili430/couchdb-khash", {ref, "ee87ab0c6bedf0b2b859a867afe5a4ce0ef422a2"}}}
]}
]}]},
{dialyzer, [
{plt_location, local},
{plt_location, COUCHDB_ROOT},
{plt_extra_apps, [
asn1, compiler, crypto, inets, kernel, runtime_tools,
sasl, setup, ssl, stdlib, syntax_tools, xmerl]},
{warnings, [unmatched_returns, error_handling, race_conditions]}]},
{post_hooks, [{compile, "escript support/build_js.escript"}]},
{relx, [
{release, {couchdb, "3.2.2"}, [
%% stdlib
asn1,
compiler,
crypto,
inets,
runtime_tools,
sasl,
ssl,
syntax_tools,
xmerl,
%% couchdb
b64url,
bear,
chttpd,
config,
couch,
couch_epi,
couch_index,
couch_log,
couch_mrview,
couch_plugins,
couch_replicator,
couch_stats,
couch_tests,
couch_event,
couch_peruser,
couch_dist,
custodian,
ddoc_cache,
dreyfus,
ets_lru,
fabric,
folsom,
global_changes,
hyper,
ibrowse,
ioq,
jiffy,
jwtf,
ken,
khash,
mango,
mem3,
mochiweb,
rexi,
setup,
smoosh,
snappy,
weatherreport,
couch_prometheus,
%% extra
recon,
triq
]},
{mode, prod},
{overlay_vars, "rel/couchdb.config"},
{sys_config, "rel/files/sys.config"},
{vm_args, "rel/files/vm.args"},
{overlay, [
{copy, "LICENSE", "LICENSE"},
{mkdir, "var/log"},
{copy, "rel/overlay/bin", "bin"},
{copy, "rel/overlay/etc", "etc"},
{copy, "bin/couchjs", "bin/couchjs"},
{copy, "share/server/main.js", "share/server/main.js"},
{copy, "share/server/main-coffee.js", "share/server/main-coffee.js"},
{copy, "bin/weatherreport", "bin/weatherreport"},
{template, "rel/overlay/etc/default.ini", "etc/default.ini"},
{template, "rel/overlay/etc/vm.args", "etc/vm.args"},
{template, "rel/files/couchdb.in", "bin/couchdb"},
{template, "rel/files/couchdb.cmd.in", "bin/couchdb.cmd"}
]}
]}
].
lists:foldl(fun({K, V}, CfgAcc) ->
case lists:keyfind(K, 1, CfgAcc) of
{K, Existent} when is_list(Existent) andalso is_list(V) ->
lists:keystore(K, 1, CfgAcc, {K, Existent ++ V});
false ->
lists:keystore(K, 1, CfgAcc, {K, V})
end
end, CONFIG, AddConfig).