This is an automated email from the ASF dual-hosted git repository. iilyak pushed a commit to branch switch-to-rebar3 in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 00f3e3bd5d3009bb21240de8f52eb7ec07232f95 Author: ILYA Khlopotov <[email protected]> AuthorDate: Wed Jul 20 10:11:14 2022 -0700 Rebar3 support (no elixir for now) --- Makefile | 123 +++------- _checkouts/ic/priv/setup_eunit.template | 21 ++ _checkouts/ic/src/ic.app.src | 7 + _checkouts/ic/src/ic.erl | 8 + _checkouts/ic/src/ic_prv_setup_eunit.erl | 81 +++++++ configure | 45 +--- mix.exs | 12 +- rebar.config.script | 250 ++++++++++++++------- src/couch/include/couch_eunit.hrl | 14 +- src/couch/rebar.config.script | 47 +++- src/couch/test/eunit/couch_ejson_compare_tests.erl | 2 + 11 files changed, 386 insertions(+), 224 deletions(-) diff --git a/Makefile b/Makefile index 82c2b335b..0397ad9b0 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ include version.mk -REBAR?=$(shell echo `pwd`/bin/rebar) +REBAR3?=$(shell echo `pwd`/bin/rebar3) ERLFMT?=$(shell echo `pwd`/bin/erlfmt) # Handle the following scenarios: @@ -27,13 +27,13 @@ ERLFMT?=$(shell echo `pwd`/bin/erlfmt) # tarball itself. # 4. When not on a clean tag, use version.mk + git sha + dirty status. -COUCHDB_GIT_SHA=$(git_sha) +# COUCHDB_GIT_SHA=$(git_sha) IN_RELEASE = $(shell if [ ! -d .git ]; then echo true; fi) ifeq ($(IN_RELEASE), true) # 1. Building from tarball, use version.mk. -COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch) +export COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch) else @@ -52,15 +52,15 @@ REL_TAG = $(shell git describe --tags --always --first-parent \ # DIRTY identifies if we're not on a commit DIRTY = $(shell git describe --dirty | grep -Eo -- '-dirty' 2>/dev/null) # COUCHDB_GIT_SHA is our current git hash. -COUCHDB_GIT_SHA=$(shell git rev-parse --short=7 --verify HEAD) +export COUCHDB_GIT_SHA=$(shell git rev-parse --short=7 --verify HEAD) ifeq ($(ON_TAG),) # 4. Not on a tag. COUCHDB_VERSION_SUFFIX = $(COUCHDB_GIT_SHA)$(DIRTY) -COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch)-$(COUCHDB_VERSION_SUFFIX) +export COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch)-$(COUCHDB_VERSION_SUFFIX) else # 2 and 3. On a tag. -COUCHDB_VERSION = $(REL_TAG)$(DIRTY) +export COUCHDB_VERSION = $(REL_TAG)$(DIRTY) endif endif @@ -71,24 +71,6 @@ space:= $(empty) $(empty) DESTDIR= -# Rebar options -apps= -skip_deps=folsom,meck,mochiweb,triq,proper,snappy,bcrypt,hyper,ibrowse -suites= -tests= - -COMPILE_OPTS=$(shell echo "\ - apps=$(apps) \ - " | sed -e 's/[a-z_]\{1,\}= / /g') -EUNIT_OPTS=$(shell echo "\ - skip_deps=$(skip_deps) \ - suites=$(suites) \ - tests=$(tests) \ - " | sed -e 's/[a-z]\{1,\}= / /g') -DIALYZE_OPTS=$(shell echo "\ - apps=$(apps) \ - skip_deps=$(skip_deps) \ - " | sed -e 's/[a-z]\{1,\}= / /g') EXUNIT_OPTS=$(subst $(comma),$(space),$(tests)) TEST_OPTS="-c 'startup_jitter=0' -c 'default_security=admin_local'" @@ -120,7 +102,8 @@ help: .PHONY: couch # target: couch - Build CouchDB core, use ERL_COMPILER_OPTIONS to provide custom compiler's options couch: config.erl - @COUCHDB_VERSION=$(COUCHDB_VERSION) COUCHDB_GIT_SHA=$(COUCHDB_GIT_SHA) $(REBAR) compile $(COMPILE_OPTS) + @# FIXME + @[ -e bin/couchjs ] || COUCHDB_VERSION=$(COUCHDB_VERSION) COUCHDB_GIT_SHA=$(COUCHDB_GIT_SHA) $(REBAR3) compile @cp src/couch/priv/couchjs bin/ @@ -140,8 +123,8 @@ fauxton: share/www .PHONY: escriptize # target: escriptize - Build CLI tools escriptize: couch - @$(REBAR) -r escriptize apps=weatherreport - @cp src/weatherreport/weatherreport bin/weatherreport + @[ -e bin/weatherreport ] || COUCHDB_VERSION=$(COUCHDB_VERSION) COUCHDB_GIT_SHA=$(COUCHDB_GIT_SHA) $(REBAR3) escriptize -a weatherreport + @cp _build/default/bin/weatherreport bin/weatherreport ################################################################################ @@ -158,51 +141,43 @@ check: all python-black @$(MAKE) elixir-suite @$(MAKE) weatherreport-test -ifdef apps -subdirs = $(apps) -else -subdirs=$(shell ls src) -endif - .PHONY: eunit # target: eunit - Run EUnit tests, use EUNIT_OPTS to provide custom options eunit: export BUILDDIR = $(shell pwd) eunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config eunit: export COUCHDB_QUERY_SERVER_JAVASCRIPT = $(shell pwd)/bin/couchjs $(shell pwd)/share/server/main.js eunit: export COUCHDB_TEST_ADMIN_PARTY_OVERRIDE=1 -eunit: couch - @COUCHDB_VERSION=$(COUCHDB_VERSION) COUCHDB_GIT_SHA=$(COUCHDB_GIT_SHA) $(REBAR) setup_eunit 2> /dev/null - @for dir in $(subdirs); do \ - COUCHDB_VERSION=$(COUCHDB_VERSION) COUCHDB_GIT_SHA=$(COUCHDB_GIT_SHA) $(REBAR) -r eunit $(EUNIT_OPTS) apps=$$dir || exit 1; \ - done - +eunit: couch setup-eunit + echo ${COUCH_VERSION} + $(REBAR3) eunit $(addprefix --app ,$(apps)) || exit 1 .PHONY: exunit # target: exunit - Run ExUnit tests exunit: export BUILDDIR = $(shell pwd) exunit: export MIX_ENV=test -exunit: export ERL_LIBS = $(shell pwd)/src +exunit: export ERL_LIBS = $(shell pwd)/_build/default/lib exunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config exunit: export COUCHDB_QUERY_SERVER_JAVASCRIPT = $(shell pwd)/bin/couchjs $(shell pwd)/share/server/main.js exunit: export COUCHDB_TEST_ADMIN_PARTY_OVERRIDE=1 exunit: couch elixir-init setup-eunit elixir-check-formatted elixir-credo @mix test --trace $(EXUNIT_OPTS) +.PHONY: setup-eunit setup-eunit: export BUILDDIR = $(shell pwd) setup-eunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config setup-eunit: - @$(REBAR) setup_eunit 2> /dev/null + @$(REBAR3) ic setup_eunit 2> /dev/null just-eunit: export BUILDDIR = $(shell pwd) just-eunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config -just-eunit: - @$(REBAR) -r eunit $(EUNIT_OPTS) +just-eunit: setup_eunit + @$(REBAR3) -r eunit $(EUNIT_OPTS) .PHONY: soak-eunit soak-eunit: export BUILDDIR = $(shell pwd) soak-eunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config -soak-eunit: couch - @$(REBAR) setup_eunit 2> /dev/null +soak-eunit: couch setup_eunit + @$(REBAR3) setup_eunit 2> /dev/null while [ $$? -eq 0 ] ; do $(REBAR) -r eunit $(EUNIT_OPTS) ; done erlfmt-check: @@ -335,30 +310,11 @@ weatherreport-test: devclean escriptize # Developing ################################################################################ - -.PHONY: build-plt -# target: build-plt - Build project-specific PLT -build-plt: - @$(REBAR) -r build-plt $(DIALYZE_OPTS) - - -.PHONY: check-plt -# target: check-plt - Check the PLT for consistency and rebuild it if it is not up-to-date -check-plt: - @$(REBAR) -r check-plt $(DIALYZE_OPTS) - - -.PHONY: dialyze +.PHONY: dialyzer # target: dialyze - Analyze the code for discrepancies -dialyze: .rebar - @$(REBAR) -r dialyze $(DIALYZE_OPTS) - +dialyzer: .rebar + @$(REBAR3) -r dialyzer $(DIALYZE_OPTS) -.PHONY: introspect -# target: introspect - Check for commits difference between rebar.config and repository -introspect: - @$(REBAR) -r update-deps - @build-aux/introspect ################################################################################ # Distributing @@ -387,28 +343,21 @@ dist: all derived release: all @echo "Installing CouchDB into rel/couchdb/ ..." @rm -rf rel/couchdb - @$(REBAR) generate # make full erlang release - @cp bin/weatherreport rel/couchdb/bin/weatherreport + @$(REBAR3) release # make full erlang release ifeq ($(with_fauxton), 1) - @mkdir -p rel/couchdb/share/ - @cp -R share/www rel/couchdb/share/ + @mkdir -p _build/default/rel/couchdb/share/ + @cp -R share/www _build/default/rel/couchdb/share/ endif ifeq ($(with_docs), 1) ifeq ($(IN_RELEASE), true) - @mkdir -p rel/couchdb/share/www/docs/ - @mkdir -p rel/couchdb/share/docs/ - @cp -R share/docs/html/* rel/couchdb/share/www/docs/ - @cp share/docs/man/apachecouchdb.1 rel/couchdb/share/docs/couchdb.1 -else - @mkdir -p rel/couchdb/share/www/docs/ - @mkdir -p rel/couchdb/share/docs/ - @cp -R src/docs/build/html/ rel/couchdb/share/www/docs - @cp src/docs/build/man/apachecouchdb.1 rel/couchdb/share/docs/couchdb.1 + @mkdir -p _build/default/rel/couchdb/share/www/docs/ + @mkdir -p _build/default/rel/couchdb/share/docs/ + @cp -R share/docs/html/* _build/default/rel/couchdb/share/www/docs/ + @cp share/docs/man/apachecouchdb.1 _build/default/rel/couchdb/share/docs/couchdb.1 endif endif - @echo "... done" @echo @echo " You can now copy the rel/couchdb directory anywhere on your system." @@ -434,23 +383,15 @@ install: release .PHONY: clean # target: clean - Remove build artifacts clean: - @$(REBAR) -r clean - @rm -rf .rebar/ + @$(REBAR3) clean + @rm -rf _build @rm -f bin/couchjs @rm -f bin/weatherreport - @rm -rf src/*/ebin - @rm -rf src/*/.rebar - @rm -rf src/*/priv/*.so - @rm -rf src/couch/priv/{couchspawnkillable,couchjs} @rm -rf share/server/main.js share/server/main-coffee.js @rm -rf tmp dev/data dev/lib dev/logs - @rm -rf src/mango/.venv - @rm -f src/couch/priv/couchspawnkillable - @rm -f src/couch/priv/couch_js/config.h @rm -f dev/*.beam dev/devnode.* dev/pbkdf2.pyc log/crash.log @rm -f dev/erlserver.pem dev/couch_ssl_dist.conf - .PHONY: distclean # target: distclean - Remove build and release artifacts distclean: clean diff --git a/_checkouts/ic/priv/setup_eunit.template b/_checkouts/ic/priv/setup_eunit.template new file mode 100644 index 000000000..fbb567c94 --- /dev/null +++ b/_checkouts/ic/priv/setup_eunit.template @@ -0,0 +1,21 @@ +{variables, [ + {package_author_name, "The Apache Software Foundation"}, + {cluster_port, 5984}, + {backend_port, 5986}, + {prometheus_port, 17986}, + {node_name, "-name [email protected]"}, + + {data_dir, "/tmp"}, + {prefix, "/tmp"}, + {view_index_dir, "/tmp"}, + {state_dir, "/tmp"} +]}. +{dir, "tmp"}. +{dir, "tmp/etc"}. +{dir, "tmp/data"}. +{dir, "tmp/tmp_data"}. + +{template, "../../../rel/overlay/etc/default.ini", "tmp/etc/default_eunit.ini"}. +{template, "../../../rel/overlay/etc/local.ini", "tmp/etc/local_eunit.ini"}. +{template, "../../../rel/files/eunit.ini", "tmp/etc/eunit.ini"}. +{template, "../../../rel/overlay/etc/vm.args", "tmp/etc/vm.args"}. diff --git a/_checkouts/ic/src/ic.app.src b/_checkouts/ic/src/ic.app.src new file mode 100644 index 000000000..cbc56fc84 --- /dev/null +++ b/_checkouts/ic/src/ic.app.src @@ -0,0 +1,7 @@ +{application, ic, [ + {description, "rebar3 ic plugin"}, + {vsn, "0.1.0"}, + {registered, []}, + {applications, [kernel, stdlib]}, + {env, []} +]}. diff --git a/_checkouts/ic/src/ic.erl b/_checkouts/ic/src/ic.erl new file mode 100644 index 000000000..f808b7d27 --- /dev/null +++ b/_checkouts/ic/src/ic.erl @@ -0,0 +1,8 @@ +-module(ic). + +-export([init/1]). + +-spec init(rebar_state:t()) -> {ok, rebar_state:t()}. +init(State) -> + {ok, State1} = ic_prv_setup_eunit:init(State), + {ok, State1}. diff --git a/_checkouts/ic/src/ic_prv_setup_eunit.erl b/_checkouts/ic/src/ic_prv_setup_eunit.erl new file mode 100644 index 000000000..16cbde364 --- /dev/null +++ b/_checkouts/ic/src/ic_prv_setup_eunit.erl @@ -0,0 +1,81 @@ +-module(ic_prv_setup_eunit). + +-behaviour(provider). + +-export([init/1, do/1, format_error/1]). + +-define(PROVIDER, setup_eunit). +-define(NAMESPACE, ic). +-define(CWD, filename:absname(rebar_dir:get_cwd())). +-define(TEMPLATE, "setup_eunit"). +-define(DEPS, []). + +%% =================================================================== +%% Public API +%% =================================================================== +-spec init(rebar_state:t()) -> {ok, rebar_state:t()}. +init(State) -> + Provider = providers:create([ + {namespace, ?NAMESPACE}, + {name, ?PROVIDER}, + {module, ?MODULE}, + {bare, true}, + {deps, ?DEPS}, + {example, "rebar3 ic setup_eunit"}, + {opts, [{force, $f, "force", undefined, "overwrite existing files"}]}, + {short_desc, "Setup eunit from template"}, + {desc, "Setup eunit from template"} + ]), + {ok, rebar_state:add_provider(State, Provider)}. + +-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. +do(State) -> + build_eunit_config(State), + {ok, State}. + +-spec format_error(any()) -> iolist(). +format_error(Reason) -> + io_lib:format("~p", [Reason]). + +%% =================================================================== +%% Internal functions +%% =================================================================== +build_eunit_config(State) -> + Force = is_forced(State), + DataDir = ?CWD ++ "/tmp/data", + TmpDataDir = ?CWD ++ "/tmp/tmp_data", + cleanup_dirs([DataDir, TmpDataDir]), + AllOpts = [ + {template, ?TEMPLATE}, + {prefix, ?CWD}, + {data_dir, DataDir}, + {view_index_dir, DataDir}, + {geo_index_dir, DataDir}, + {state_dir, TmpDataDir} + ], + StateNew = lists:foldl( + fun({Key, Value}, StateAcc) -> + rebar_state:set(StateAcc, Key, Value) + end, + State, + AllOpts + ), + ok = rebar_templater:new(?TEMPLATE, [], Force, StateNew). + +is_forced(State) -> + {Args, _} = rebar_state:command_parsed_args(State), + case proplists:get_value(force, Args) of + undefined -> false; + _ -> true + end. + +cleanup_dirs(Dirs) -> + [del_dir(Dir) || Dir <- Dirs, filelib:is_dir(Dir)]. + +del_dir(Dir) -> + All = filelib:wildcard(Dir ++ "/**"), + {Dirs, Files} = lists:partition(fun filelib:is_dir/1, All), + lists:foreach(fun file:delete/1, Files), + SortedDirs = lists:sort(fun(A, B) -> length(A) > length(B) end, Dirs), + lists:foreach(fun file:del_dir/1, SortedDirs), + file:del_dir(Dir). diff --git a/configure b/configure index 9f8cb6828..504a8a872 100755 --- a/configure +++ b/configure @@ -55,7 +55,6 @@ Options: --dev alias for --disable-docs --disable-fauxton --spidermonkey-version VSN specify the version of SpiderMonkey to use (defaults to $SM_VSN) --skip-deps do not update erlang dependencies - --rebar=PATH use rebar by specified path (version >=2.6.0 && <3.0 required) --generate-tls-dev-cert generate a cert for TLS distribution (To enable TLS, change the vm.args file.) --rebar3=PATH use rebar3 by specified path --erlfmt=PATH use erlfmt by specified path @@ -126,22 +125,6 @@ parse_opts() { continue ;; - --rebar) - if [ -x "$2" ]; then - version=`$2 --version 2> /dev/null | grep -o "2\.[6-9]\.[0-9]"` - if [ $? -ne 0 ]; then - printf 'Rebar >=2.6.0 and <3.0.0 required' >&2 - exit 1 - fi - eval REBAR=$2 - shift 2 - continue - else - printf 'ERROR: "--rebar" requires valid path to executable.\n' >&2 - exit 1 - fi - ;; - --rebar3) if [ -x "$2" ]; then eval REBAR3=$2 @@ -291,27 +274,14 @@ cat > $rootdir/config.erl << EOF {spidermonkey_version, "$SM_VSN"}. EOF -install_local_rebar() { - if [ ! -x "${rootdir}/bin/rebar" ]; then - if [ ! -d "${rootdir}/src/rebar" ]; then - # git clone --depth 1 https://github.com/apache/couchdb-rebar.git ${rootdir}/src/rebar - git clone https://github.com/apache/couchdb-rebar.git ${rootdir}/src/rebar - fi - make -C ${rootdir}/src/rebar - mv ${rootdir}/src/rebar/rebar ${rootdir}/bin/rebar - make -C ${rootdir}/src/rebar clean - fi -} - install_local_rebar3() { if [ ! -x "${rootdir}/bin/rebar3" ]; then if [ ! -d "${rootdir}/src/rebar3" ]; then - git clone --depth 1 --branch ${REBAR3_BRANCH} https://github.com/erlang/rebar3.git ${rootdir}/src/rebar3 + #git clone --depth 1 --branch 82-rebar3 https://github.com/jiahuili430/rebar3.git ${rootdir}/apps/rebar3 + git clone --depth 1 https://github.com/erlang/rebar3 ${rootdir}/src/rebar3 fi - cd src/rebar3 - ./bootstrap - mv ${rootdir}/src/rebar3/rebar3 ${rootdir}/bin/rebar3 - cd ../.. + cd ${rootdir}/src/rebar3 && ./bootstrap && mv rebar3 ${rootdir}/bin/rebar3 + cd ${rootdir} fi } @@ -328,11 +298,6 @@ install_local_erlfmt() { fi } -if [ -z "${REBAR}" ]; then - install_local_rebar - REBAR=${rootdir}/bin/rebar -fi - if [ -z "${REBAR3}" ]; then install_local_rebar3 REBAR3=${rootdir}/bin/rebar3 @@ -346,7 +311,7 @@ fi # only update dependencies, when we are not in a release tarball if [ -d .git -a $SKIP_DEPS -ne 1 ]; then echo "==> updating dependencies" - ${REBAR} get-deps update-deps + ${REBAR3} get-deps fi # External repos frequently become integrated with the primary repo, diff --git a/mix.exs b/mix.exs index 4dda326a1..608283a6e 100644 --- a/mix.exs +++ b/mix.exs @@ -52,7 +52,7 @@ defmodule CouchDBTest.Mixfile do version: "0.1.0", elixir: "~> 1.13", lockfile: Path.expand("mix.lock", __DIR__), - deps_path: Path.expand("src", __DIR__), + deps_path: Path.expand("_build/default/lib", __DIR__), build_path: Path.expand("_build", __DIR__), compilers: [:elixir, :app], start_permanent: Mix.env() == :prod, @@ -72,7 +72,7 @@ defmodule CouchDBTest.Mixfile do # Run "mix help compile.app" to learn about applications. def application do [ - extra_applications: [:logger], + extra_applications: [:logger, :couch_log, :config], applications: [:httpotion] ] end @@ -90,14 +90,14 @@ defmodule CouchDBTest.Mixfile do {:excoveralls, "~> 0.12", only: :test}, {:b64url, path: path("b64url")}, {:jiffy, path: path("jiffy")}, - {:jwtf, path: path("jwtf")}, + {:jwtf, path: Path.expand("src/jwtf", __DIR__)}, {:ibrowse, path: path("ibrowse"), override: true}, {:credo, "~> 1.6.4", only: [:dev, :test, :integration], runtime: false} ] end defp path(app) do - lib_dir = Path.expand("src", __DIR__) + lib_dir = Path.expand("_build/default/lib", __DIR__) Path.expand(app, lib_dir) end @@ -148,7 +148,7 @@ defmodule CouchDBTest.Mixfile do "folsom" ] - deps |> Enum.map(fn app -> "src/#{app}" end) + deps |> Enum.map(fn app -> "_build/default/lib/#{app}" end) end defp get_coverage_paths() do @@ -158,7 +158,7 @@ defmodule CouchDBTest.Mixfile do MapSet.put(set, "#{x}/ebin") end) - Path.wildcard("src/*/ebin") + Path.wildcard("_build/default/lib/*/ebin") |> Enum.filter(&File.dir?/1) |> Enum.filter(fn path -> not MapSet.member?(deps, path) end) end diff --git a/rebar.config.script b/rebar.config.script index 1aa16305a..322963b8f 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -104,62 +104,6 @@ end. os:putenv("COUCHDB_APPS_CONFIG_DIR", filename:join([COUCHDB_ROOT, "rel/apps"])). -SubDirs = [ - %% must be compiled first as it has a custom behavior - "src/couch_epi", - "src/couch_log", - "src/chttpd", - "src/couch", - "src/couch_event", - "src/mem3", - "src/couch_index", - "src/couch_mrview", - "src/couch_replicator", - "src/couch_plugins", - "src/couch_pse_tests", - "src/couch_stats", - "src/couch_peruser", - "src/couch_tests", - "src/couch_dist", - "src/custodian", - "src/ddoc_cache", - "src/dreyfus", - "src/fabric", - "src/global_changes", - "src/ioq", - "src/jwtf", - "src/ken", - "src/mango", - "src/rexi", - "src/setup", - "src/smoosh", - "src/weatherreport", - "src/couch_prometheus", - "rel" -]. - -DepDescs = [ -%% Independent Apps -{config, "config", {tag, "2.1.9"}}, -{b64url, "b64url", {tag, "1.0.3"}}, -{ets_lru, "ets-lru", {tag, "1.1.0"}}, -{khash, "khash", {tag, "1.1.0"}}, -{snappy, "snappy", {tag, "CouchDB-1.0.8"}}, - -%% Non-Erlang deps -{docs, {url, "https://github.com/apache/couchdb-documentation"}, - {tag, "3.2.1-1"}, [raw]}, -{fauxton, {url, "https://github.com/apache/couchdb-fauxton"}, - {tag, "v1.2.8"}, [raw]}, -%% Third party deps -{folsom, "folsom", {tag, "CouchDB-0.8.4"}}, -{hyper, "hyper", {tag, "CouchDB-2.2.0-7"}}, -{ibrowse, "ibrowse", {tag, "CouchDB-4.4.2-5"}}, -{jiffy, "jiffy", {tag, "1.1.1"}}, -{mochiweb, "mochiweb", {tag, "v3.0.0"}}, -{meck, "meck", {tag, "0.9.2"}}, -{recon, "recon", {tag, "2.5.2"}} -]. WithProper = lists:keyfind(with_proper, 1, CouchConfig) == {with_proper, true}. @@ -170,30 +114,99 @@ OptionalDeps = case WithProper of [] end. -BaseUrl = "https://github.com/apache/". - -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, "23|24|25"}, - {deps_dir, "src"}, - {deps, lists:map(MakeDep, DepDescs ++ OptionalDeps)}, - {sub_dirs, SubDirs}, - {lib_dirs, ["src"]}, - {erl_opts, [{i, "../"}, {d, 'COUCHDB_ERLANG_VERSION', VerString}]}, - {eunit_opts, [verbose, {report,{eunit_surefire,[{dir,"."}]}}]}, - {plugins, [eunit_plugin]}, + {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}, @@ -201,7 +214,86 @@ AddConfig = [ 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"}]} + {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) -> diff --git a/src/couch/include/couch_eunit.hrl b/src/couch/include/couch_eunit.hrl index 188524893..d8e96fa90 100644 --- a/src/couch/include/couch_eunit.hrl +++ b/src/couch/include/couch_eunit.hrl @@ -32,7 +32,19 @@ -define(TEMPDIR, filename:join([?BUILDDIR(), "tmp", "tmp_data"])). --define(APPDIR, filename:dirname(element(2, file:get_cwd()))). + +%% Rebar3 doesn't change the current directory +%% Therefore the only way to get the directory of current app +%% is to construct it from ?FILE +%% we iterate backwards and remove elements until we find "test" +%% then remove "test" entry by calling `filename:dirname/` +-define(APPDIR, filename:dirname( + filename:join( + lists:reverse( + lists:dropwhile( + fun(E) -> E =/= "test" end, + lists:reverse(filename:split(?FILE))))))). + %% Account for the fact that source files are in src/<app>/.eunit/<module>.erl %% when run from eunit -define(ABS_PATH(File), %% src/<app>/.eunit/<module>.erl diff --git a/src/couch/rebar.config.script b/src/couch/rebar.config.script index ba907b0a2..9ba8f1866 100644 --- a/src/couch/rebar.config.script +++ b/src/couch/rebar.config.script @@ -90,11 +90,11 @@ ConfigH = [ CouchJSConfig = case SMVsn of "78" -> - "priv/couch_js/86/config.h"; + APP_DIR ++ "/priv/couch_js/86/config.h"; "91" -> - "priv/couch_js/86/config.h"; + APP_DIR ++ "/priv/couch_js/86/config.h"; _ -> - "priv/couch_js/" ++ SMVsn ++ "/config.h" + APP_DIR ++ "/priv/couch_js/" ++ SMVsn ++ "/config.h" end. ConfigSrc = [["#define ", K, " ", V, $\n] || {K, V} <- ConfigH]. ConfigBin = iolist_to_binary(ConfigSrc). @@ -210,7 +210,7 @@ BaseSpecs = [ ]. SpawnSpec = [ - {"priv/couchspawnkillable", ["priv/spawnkillable/*.c"]} + {APP_DIR ++ "/priv/couchspawnkillable", [APP_DIR ++ "/priv/spawnkillable/*.c"]} ]. %% hack required until switch to enc/rebar3 @@ -223,16 +223,49 @@ PortSpecs = case os:type() of {win32, _} -> BaseSpecs ++ SpawnSpec; _ -> - {ok, CSK} = file:read_file("priv/spawnkillable/couchspawnkillable.sh"), - ok = CopyIfDifferent("priv/couchspawnkillable", CSK), - os:cmd("chmod +x priv/couchspawnkillable"), + {ok, CSK} = file:read_file(APP_DIR ++ "/priv/spawnkillable/couchspawnkillable.sh"), + ok = CopyIfDifferent(APP_DIR ++ "/priv/couchspawnkillable", CSK), + os:cmd("chmod +x " ++ APP_DIR ++ "/priv/couchspawnkillable"), BaseSpecs end. PlatformDefines = [ {platform_define, "win32", 'WINDOWS'} ]. + +LibDir = "../../_build/default/lib/". + AddConfig = [ {port_specs, PortSpecs}, + {plugins, [rebar3_path_deps]}, + {deps, [ + {config, {path, LibDir ++ "config"}}, + {proper, {path, LibDir ++ "proper"}}, + {bear, {path, LibDir ++ "bear"}}, + {b64url, {path, LibDir ++ "b64url"}}, + {ets_lru, {path, LibDir ++ "ets_lru"}}, + {ibrowse, {path, LibDir ++ "ibrowse"}}, + {jiffy, {path, LibDir ++ "jiffy"}}, + {mochiweb, {path, LibDir ++ "mochiweb"}}, + {meck, {path, LibDir ++ "meck"}}, + {recon, {path, LibDir ++ "recon"}}, + {khash, {path, LibDir ++ "khash"}}, + {snappy, {path, LibDir ++ "snappy"}}, + {folsom, {path, LibDir ++ "folsom"}}, + {hyper, {path, LibDir ++ "hyper"}} + ]}, + {profiles, [{test, [ + {extra_src_dirs, [{"test", [{recursive, true}]}]}, + {deps, [ + {b64url, {path, LibDir ++ "b64url"}}, + {ets_lru, {path, LibDir ++ "ets_lru"}}, + {jiffy, {path, LibDir ++ "jiffy"}}, + {config, {path, LibDir ++ "config"}}, + {khash, {path, LibDir ++ "khash"}} + ]} + ]}]}, + {eunit_tests, [ + {application, config} + ]}, {erl_opts, PlatformDefines ++ [ {d, 'COUCHDB_VERSION', Version}, {d, 'COUCHDB_GIT_SHA', GitSha}, diff --git a/src/couch/test/eunit/couch_ejson_compare_tests.erl b/src/couch/test/eunit/couch_ejson_compare_tests.erl index ae4a5ff7c..2ac1695ac 100644 --- a/src/couch/test/eunit/couch_ejson_compare_tests.erl +++ b/src/couch/test/eunit/couch_ejson_compare_tests.erl @@ -51,6 +51,8 @@ {[{<<"b">>, 2}, {<<"c">>, 2}]} ]). +-include_lib("eunit/include/eunit.hrl"). + % Propery tests -ifdef(WITH_PROPER).
